From 4275d49cebd42f37c26d2bd86654e47949e8ba48 Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Fri, 19 Dec 2025 16:11:02 +0100 Subject: [PATCH 1/8] Bindless : first draft DX12 only --- h3d/impl/DX12Driver.hx | 159 ++++++++++++++++++++------ h3d/impl/Driver.hx | 8 ++ h3d/impl/RenderContext.hx | 15 ++- h3d/mat/TextureHandle.hx | 11 ++ h3d/scene/MeshBatch.hx | 7 ++ h3d/scene/RenderContext.hx | 4 + h3d/shader/Buffers.hx | 6 + hxsl/Ast.hx | 5 +- hxsl/Cache.hx | 34 +++++- hxsl/Checker.hx | 2 + hxsl/Dce.hx | 10 ++ hxsl/Flatten.hx | 4 + hxsl/GlslOut.hx | 2 + hxsl/HlslOut.hx | 26 +++++ hxsl/MacroParser.hx | 1 + hxsl/Macros.hx | 2 + hxsl/RuntimeShader.hx | 7 ++ hxsl/Serializer.hx | 4 +- hxsl/Splitter.hx | 4 + hxsl/Types.hx | 1 + samples/Bindless.hx | 109 ++++++++++++++++++ samples/bindless_res/rock.hmd | Bin 0 -> 7956 bytes samples/bindless_res/rockTexture.jpg | Bin 0 -> 38233 bytes samples/bindless_res/rockTexture2.jpg | Bin 0 -> 121912 bytes samples/bindless_res/tree.hmd | Bin 0 -> 15999 bytes samples/bindless_res/treeTexture.png | Bin 0 -> 30174 bytes samples/bindless_res/treeTexture2.png | Bin 0 -> 33486 bytes 27 files changed, 378 insertions(+), 43 deletions(-) create mode 100644 h3d/mat/TextureHandle.hx create mode 100644 samples/Bindless.hx create mode 100644 samples/bindless_res/rock.hmd create mode 100644 samples/bindless_res/rockTexture.jpg create mode 100644 samples/bindless_res/rockTexture2.jpg create mode 100644 samples/bindless_res/tree.hmd create mode 100644 samples/bindless_res/treeTexture.png create mode 100644 samples/bindless_res/treeTexture2.png diff --git a/h3d/impl/DX12Driver.hx b/h3d/impl/DX12Driver.hx index e87d40f5aa..44f291bb21 100644 --- a/h3d/impl/DX12Driver.hx +++ b/h3d/impl/DX12Driver.hx @@ -302,10 +302,10 @@ class CompiledShader { class BaseHeap { public var stride(default,null) : Int; - var size : Int; + public var size(default,null) : Int; + public var address(default,null) : Address; var type : DescriptorHeapType; var heap : DescriptorHeap; - var address : Address; var cpuToGpu : Int64; var shaderVisible : Bool; @@ -328,6 +328,10 @@ class BaseHeap { cpuToGpu = desc.flags == SHADER_VISIBLE ? ( heap.getHandle(true).value - address.value ) : 0; } + public dynamic function onFree( prev : DescriptorHeap, prevSize : Int ) { + throw "Too many buffers"; + } + public inline function toGPU( address : Address ) : Address { return new Address(address.value + cpuToGpu); } @@ -354,10 +358,6 @@ class ScratchHeap extends BaseHeap { super.allocHeap(size); } - public dynamic function onFree( prev : DescriptorHeap, prevSize : Int ) { - throw "Too many buffers"; - } - public function alloc( count : Int ) { if( cursor + count > size ) { var prevCursor = cursor; @@ -382,6 +382,7 @@ class ScratchHeap extends BaseHeap { class BlockHeap extends BaseHeap { var freeList : Array; + public var available(get,never) : Int; override public function new(type,size,shaderVisible) { if ( shaderVisible ) @@ -390,18 +391,20 @@ class BlockHeap extends BaseHeap { freeList = [for (i in 0...size) i]; } + function resize() { + var prevSize = size; + var prev = heap; + allocHeap(getNextHeapSize()); + for ( i in prevSize + 1...size) + freeList.push(i); + onFree(prev, prevSize); + } + public function allocIndex() : Int { var idx = freeList.pop(); if ( idx == null ) { - var prevAddress = address.value; - var prevSize = size; - var prev = heap; - allocHeap(getNextHeapSize()); - Driver.copyDescriptorsSimple(prevSize, address.value, prevAddress, type); - idx = prevSize; - for ( i in prevSize + 1...size) - freeList.push(i); - (prev : Resource).release(); + idx = size; + resize(); } return idx; } @@ -409,6 +412,14 @@ class BlockHeap extends BaseHeap { public function disposeIndex( index : Int ) { freeList.push(index); } + + inline function get_available() { + return freeList.length; + } + + public inline function isEmpty() { + return available == size; + } } class ResourceData { @@ -441,6 +452,7 @@ class TextureData extends ResourceData { public var uploadBuffer : TextureUploadBuffer; var clearColorChanges : Int; public var cpuViewsIndex : Array = [for (i in 0...16) -1]; + public var handles : Map = []; public function setClearColor( c : h3d.Vector4 ) { var color = color; @@ -478,6 +490,8 @@ class DX12Driver extends h3d.impl.Driver { var cpuSrvHeap : BlockHeap; var cpuSamplerHeap : ScratchHeap; var cpuSamplersIndex : Map; + var bindlessSrvHeap : BlockHeap; + var bindlessSamplerHeap : BlockHeap; var indirectCommand : CommandSignature; var currentFrame : Int; @@ -546,8 +560,8 @@ class DX12Driver extends h3d.impl.Driver { f.allocator = new CommandAllocator(DIRECT); f.commandList = new CommandList(DIRECT, f.allocator, null); f.commandList.close(); - f.srvHeapCache = new ScratchHeapArray(CBV_SRV_UAV, INITIAL_SRV_COUNT); - f.samplerHeapCache = new ScratchHeapArray(SAMPLER, INITIAL_SAMPLER_COUNT); + f.srvHeapCache = new ScratchHeapArray(CBV_SRV_UAV, INITIAL_SRV_COUNT * 2); + f.samplerHeapCache = new ScratchHeapArray(SAMPLER, INITIAL_SAMPLER_COUNT * 2); if ( f.bufferAllocator != null ) f.bufferAllocator.dispose(); f.bufferAllocator = new BufferAllocator(INITIAL_BUFFER_ALLOCATOR_SIZE); @@ -563,14 +577,32 @@ class DX12Driver extends h3d.impl.Driver { depthStenciViews.onFree = function(prev, prevSize) frame.toRelease.push(prev); cpuSrvHeap = new BlockHeap(CBV_SRV_UAV, INITIAL_SRV_COUNT, false); + cpuSrvHeap.onFree = function(prev, prevSize) @:privateAccess { + Driver.copyDescriptorsSimple(prevSize, cpuSrvHeap.address.value, prev.getHandle(false).value, CBV_SRV_UAV); + (prev : Resource).release(); + } + cpuSamplerHeap = new ScratchHeap(SAMPLER, INITIAL_SAMPLER_COUNT, false); cpuSamplerHeap.onFree = function(prev, prevSize) @:privateAccess { Driver.copyDescriptorsSimple(prevSize, cpuSamplerHeap.address.value, prev.getHandle(false).value, SAMPLER); - cpuSamplerHeap.alloc(prevSize); + cpuSamplerHeap.cursor = prevSize; (prev : Resource).release(); } cpuSamplersIndex = []; + bindlessSrvHeap = new BlockHeap(CBV_SRV_UAV, INITIAL_SRV_COUNT, false); + bindlessSrvHeap.onFree = function(prev, prevSize) @:privateAccess { + Driver.copyDescriptorsSimple(prevSize, bindlessSrvHeap.address.value, prev.getHandle(false).value, CBV_SRV_UAV); + (prev : Resource).release(); + flushHeaps(); + } + bindlessSamplerHeap = new BlockHeap(SAMPLER, INITIAL_SAMPLER_COUNT, false); + bindlessSamplerHeap.onFree = function(prev, prevSize) @:privateAccess { + Driver.copyDescriptorsSimple(prevSize, bindlessSamplerHeap.address.value, prev.getHandle(false).value, SAMPLER); + (prev : Resource).release(); + flushHeaps(); + } + if ( h3d.Engine.getCurrent() != null ) { defaultDepth = new h3d.mat.Texture(0,0, Depth24Stencil8); defaultDepth.t = new TextureData(); @@ -595,7 +627,6 @@ class DX12Driver extends h3d.impl.Driver { function beginFrame() { frameCount = hxd.Timer.frameCount; - heapCount++; currentFrame = Driver.getCurrentBackBufferIndex(); var prevFrame = frame; frame = frames[currentFrame]; @@ -648,13 +679,7 @@ class DX12Driver extends h3d.impl.Driver { frame.srvHeapCache.reset(); frame.samplerHeapCache.reset(); - frame.srvHeap = frame.srvHeapCache.next(); - frame.samplerHeap = frame.samplerHeapCache.next(); - - var arr = tmp.descriptors2; - arr[0] = @:privateAccess frame.srvHeap.heap; - arr[1] = @:privateAccess frame.samplerHeap.heap; - frame.commandList.setDescriptorHeaps(arr); + flushHeaps(); } override function clear(?color:Vector4, ?depth:Float, ?stencil:Int) { @@ -1511,6 +1536,10 @@ class DX12Driver extends h3d.impl.Driver { sign.flags.set(DENY_VERTEX_SHADER_ROOT_ACCESS); } else sign.flags.set(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT); + if ( shader.hasBindless() ) { + sign.flags.set(CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED); + sign.flags.set(SAMPLER_HEAP_DIRECTLY_INDEXED); + } sign.flags.set(DENY_HULL_SHADER_ROOT_ACCESS); sign.flags.set(DENY_DOMAIN_SHADER_ROOT_ACCESS); sign.flags.set(DENY_GEOMETRY_SHADER_ROOT_ACCESS); @@ -1531,9 +1560,9 @@ class DX12Driver extends h3d.impl.Driver { var c = new CompiledShader(); var rootStr = stringifyRootSignature(res.sign, "ROOT_SIGNATURE", res.params, res.paramsCount); - var vs = shader.mode == Compute ? null : compileSource(shader.vertex, "vs_6_0", rootStr); - var ps = shader.mode == Compute ? null : compileSource(shader.fragment, "ps_6_0", rootStr); - var cs = shader.mode == Compute ? compileSource(shader.compute, "cs_6_0", rootStr) : null; + var vs = shader.mode == Compute ? null : compileSource(shader.vertex, "vs_6_6", rootStr); + var ps = shader.mode == Compute ? null : compileSource(shader.fragment, "ps_6_6", rootStr); + var cs = shader.mode == Compute ? compileSource(shader.compute, "cs_6_6", rootStr) : null; var signSize = 0; var signBytes = Driver.serializeRootSignature(res.sign, 1, signSize); @@ -2187,6 +2216,10 @@ class DX12Driver extends h3d.impl.Driver { frame.commandList.setComputeRoot32BitConstants(regs.params, dataSize >> 2, data, 0); else frame.commandList.setGraphicsRoot32BitConstants(regs.params, dataSize >> 2, data, 0); + for ( i in 0...shader.paramsHandleCount ) { + var handle = buf.paramsHandles[i]; + transition(handle.texture.t, shader.kind == Fragment ? PIXEL_SHADER_RESOURCE : NON_PIXEL_SHADER_RESOURCE); + } } case Globals: var isFragment = shader.kind == Fragment; @@ -2211,6 +2244,10 @@ class DX12Driver extends h3d.impl.Driver { frame.commandList.setComputeRoot32BitConstants(regs.globals, dataSize >> 2, data, 0); else frame.commandList.setGraphicsRoot32BitConstants(regs.globals, dataSize >> 2, data, 0); + for ( i in 0...shader.globalsHandleCount ) { + var handle = buf.globalsHandles[i]; + transition(handle.texture.t, isFragment ? PIXEL_SHADER_RESOURCE : NON_PIXEL_SHADER_RESOURCE); + } } if ( isFragment ) lastFragmentGlobalBind = bind; @@ -2438,6 +2475,13 @@ class DX12Driver extends h3d.impl.Driver { } } + override function selectTextureHandles( handles : Array ) { + for( i in 0...handles.length ) { + var th = handles[i]; + transition(th.texture.t, PIXEL_SHADER_RESOURCE); + } + } + override function selectBuffer(buffer:Buffer) { var views = tmp.vertexViews; var bview = buffer.vbuf.view; @@ -2700,15 +2744,24 @@ class DX12Driver extends h3d.impl.Driver { } } - override function flushShaderBuffers() { - if( frame.srvHeap.available < 128 || frame.samplerHeap.available < 64 ) { - frame.srvHeap = frame.srvHeapCache.next(); - frame.samplerHeap = frame.samplerHeapCache.next(); - heapCount++; - var arr = tmp.descriptors2; - arr[0] = @:privateAccess frame.srvHeap.heap; - arr[1] = @:privateAccess frame.samplerHeap.heap; - frame.commandList.setDescriptorHeaps(arr); + function flushHeaps(rebind : Bool = false) { + frame.srvHeap = frame.srvHeapCache.next(); + frame.samplerHeap = frame.samplerHeapCache.next(); + heapCount++; + var arr = tmp.descriptors2; + arr[0] = @:privateAccess frame.srvHeap.heap; + arr[1] = @:privateAccess frame.samplerHeap.heap; + frame.commandList.setDescriptorHeaps(arr); + + if ( !bindlessSrvHeap.isEmpty() ) + Driver.copyDescriptorsSimple( bindlessSrvHeap.size, frame.srvHeap.address.value, bindlessSrvHeap.address.value, CBV_SRV_UAV ); + if ( !bindlessSamplerHeap.isEmpty() ) + Driver.copyDescriptorsSimple( bindlessSamplerHeap.size, frame.samplerHeap.address.value, bindlessSamplerHeap.address.value, SAMPLER ); + + @:privateAccess frame.srvHeap.cursor = bindlessSrvHeap.size; + @:privateAccess frame.samplerHeap.cursor = bindlessSamplerHeap.size; + + if ( rebind ) { inline function rebindGlobal(bindSlot, desc) { if ( bindSlot >= 0 ) { var srv = frame.srvHeap.alloc(1); @@ -2722,9 +2775,22 @@ class DX12Driver extends h3d.impl.Driver { rebindGlobal(lastVertexGlobalBind, tmp.vertexGlobalDesc); rebindGlobal(lastFragmentGlobalBind, tmp.fragmentGlobalDesc); + + if ( currentShader.shader.hasBindless() ) { + if ( currentShader.isCompute ) + frame.commandList.setComputeRootSignature(currentShader.rootSignature); + else + frame.commandList.setGraphicsRootSignature(currentShader.rootSignature); + frame.commandList.setPipelineState(currentPipelineState); + } } } + override function flushShaderBuffers() { + if( frame.srvHeap.available < 128 || frame.samplerHeap.available < 64 ) + flushHeaps(true); + } + function flushFrame( onResize : Bool = false ) { flushQueries(); frame.commandList.close(); @@ -2775,6 +2841,23 @@ class DX12Driver extends h3d.impl.Driver { needUAVBarrier = true; } + override function getTextureHandle( t : h3d.mat.Texture ) : h3d.mat.TextureHandle { + var handle = t.t.handles.get(t.bits); + if ( handle == null ) { + var sampler = getCpuSampler(t); + var srv = getCpuTexView(t); + var srvIndex = bindlessSrvHeap.allocIndex(); + var samplerIndex = bindlessSamplerHeap.allocIndex(); + Driver.copyDescriptorsSimple(1, bindlessSrvHeap.getCpuAddressAt(srvIndex), srv, CBV_SRV_UAV); + Driver.copyDescriptorsSimple(1, frame.srvHeap.getCpuAddressAt(srvIndex), srv, CBV_SRV_UAV); + Driver.copyDescriptorsSimple(1, bindlessSamplerHeap.getCpuAddressAt(samplerIndex), sampler, SAMPLER); + Driver.copyDescriptorsSimple(1, frame.samplerHeap.getCpuAddressAt(samplerIndex), sampler, SAMPLER); + handle = new h3d.mat.TextureHandle(t, haxe.Int64.make(samplerIndex, srvIndex)); + t.t.handles.set(t.bits, handle); + } + return handle; + } + } #end diff --git a/h3d/impl/Driver.hx b/h3d/impl/Driver.hx index 9b8ab1e24f..78c87124ee 100644 --- a/h3d/impl/Driver.hx +++ b/h3d/impl/Driver.hx @@ -183,6 +183,9 @@ class Driver { public function selectMaterial( pass : h3d.mat.Pass ) { } + public function selectTextureHandles( handles : Array ) { + } + public function uploadShaderBuffers( buffers : h3d.shader.Buffers, which : h3d.shader.Buffers.BufferKind ) { } @@ -320,4 +323,9 @@ class Driver { throw "Compute shaders are not implemented on this platform"; } + // --- Bindless + + public function getTextureHandle( t : h3d.mat.Texture ) : h3d.mat.TextureHandle { + throw "Bindless is not implemented on this platform"; + } } \ No newline at end of file diff --git a/h3d/impl/RenderContext.hx b/h3d/impl/RenderContext.hx index 5049cf3647..844f433ab9 100644 --- a/h3d/impl/RenderContext.hx +++ b/h3d/impl/RenderContext.hx @@ -168,6 +168,10 @@ class RenderContext { for( vv in vl ) tot += fillRec(Reflect.field(v, vv.name), vv.type, out, pos + tot); return tot; + case TTextureHandle: + var v : h3d.mat.TextureHandle = v; + fillIntParam(v.handle.low, pos, out); + fillIntParam(v.handle.high, pos + 1, out); default: throw "assert " + type; } @@ -214,10 +218,13 @@ class RenderContext { inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) { var g = s.globals; var ptr = getPtr(buf.globals); + var hid = 0; while( g != null ) { - var v = globals.fastGet(g.gid); + var v : Dynamic = globals.fastGet(g.gid); if( v == null ) throw "Missing global value " + g.path; + if ( g.type.match(TTextureHandle) ) + buf.globalsHandles[hid++] = v; fillRec(v, g.type, ptr, g.pos); g = g.next; } @@ -255,6 +262,7 @@ class RenderContext { inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) { var p = s.params; var ptr = getPtr(buf.params); + var hid = 0; while( p != null ) { var v : Dynamic; if( p.perObjectGlobal == null ) { @@ -268,9 +276,12 @@ class RenderContext { fillIntParam(Std.int(i.getParamFloatValue(p.index)), p.pos, ptr); p = p.next; continue; + case TTextureHandle: + v = i.getParamValue(p.index); + buf.paramsHandles[hid++] = v; default: + v = i.getParamValue(p.index); } - v = i.getParamValue(p.index); if( v == null ) throw "Missing param value " + curInstanceValue + "." + p.name; } else v = getParamValue(p, shaders); diff --git a/h3d/mat/TextureHandle.hx b/h3d/mat/TextureHandle.hx new file mode 100644 index 0000000000..157b88db31 --- /dev/null +++ b/h3d/mat/TextureHandle.hx @@ -0,0 +1,11 @@ +package h3d.mat; + +@:allow(h3d.impl.Driver) +class TextureHandle { + public var texture(default, null) : h3d.mat.Texture; + public var handle(default, null) : haxe.Int64; + function new(t : h3d.mat.Texture, handle : haxe.Int64) { + texture = t; + this.handle = handle; + } +} \ No newline at end of file diff --git a/h3d/scene/MeshBatch.hx b/h3d/scene/MeshBatch.hx index 73fa339bdc..ff33f6f743 100644 --- a/h3d/scene/MeshBatch.hx +++ b/h3d/scene/MeshBatch.hx @@ -566,6 +566,11 @@ class MeshBatch extends MultiMaterial { case TMat4: var m : h3d.Matrix = curShader.getParamValue(p.index); bufLoader.loadMatrix(m); + case TTextureHandle: + var v : h3d.mat.TextureHandle = curShader.getParamValue(p.index); + batch.textureHandles.push(v); + bufLoader.loadInt(v.handle.low); + bufLoader.loadInt(v.handle.high); default: throw "Unsupported batch type "+p.type; } @@ -616,6 +621,7 @@ class MeshBatch extends MultiMaterial { p = p.next; } ctx.uploadParams(); + ctx.selectTextureHandles(p.textureHandles); var prev = ctx.drawPass.index; ctx.drawPass.index >>= 16; super.draw(ctx); @@ -714,6 +720,7 @@ class BatchData { public var indirectCallBuffers : Array; public var buffers : Array = []; public var bufferFormat : hxd.BufferFormat; + public var textureHandles : Array = []; public var data : hxd.FloatBuffer; public var params : hxsl.RuntimeShader.AllocParam; public var shader : hxsl.BatchShader; diff --git a/h3d/scene/RenderContext.hx b/h3d/scene/RenderContext.hx index deb0852cde..e8dcc78fab 100644 --- a/h3d/scene/RenderContext.hx +++ b/h3d/scene/RenderContext.hx @@ -255,6 +255,10 @@ class RenderContext extends h3d.impl.RenderContext { return useReverseDepth ? 0 : 1; } + public function selectTextureHandles(handles : Array) { + engine.driver.selectTextureHandles(handles); + } + public function uploadParams() { fillParams(shaderBuffers, drawPass.shader, drawPass.shaders); engine.uploadInstanceShaderBuffers(shaderBuffers); diff --git a/h3d/shader/Buffers.hx b/h3d/shader/Buffers.hx index f315d2126f..3cee66da0a 100644 --- a/h3d/shader/Buffers.hx +++ b/h3d/shader/Buffers.hx @@ -12,7 +12,9 @@ typedef ShaderBufferData = hxd.impl.TypedArray.Float32Array; class ShaderBuffers { public var globals : ShaderBufferData; + public var globalsHandles : haxe.ds.Vector; public var params : ShaderBufferData; + public var paramsHandles : haxe.ds.Vector; public var tex : haxe.ds.Vector; public var buffers : haxe.ds.Vector; @@ -27,10 +29,14 @@ class ShaderBuffers { var np = s.paramsSize << 2; var nt = s.texturesCount; var nb = s.bufferCount; + var ngh = s.globalsHandleCount; + var nph = s.paramsHandleCount; if( globals.length < ng ) globals = new ShaderBufferData(ng); if( params.length < np ) params = new ShaderBufferData(np); if( tex.length < nt ) tex = new haxe.ds.Vector(nt); if( nb > 0 && (buffers == null || buffers.length < nb) ) buffers = new haxe.ds.Vector(nb); + if( ngh > 0 && (globalsHandles == null || globalsHandles.length < ngh) ) globalsHandles = new haxe.ds.Vector(ngh); + if( nph > 0 && (paramsHandles == null || paramsHandles.length < nph) ) paramsHandles = new haxe.ds.Vector(nph); } } diff --git a/hxsl/Ast.hx b/hxsl/Ast.hx index fdf5f40732..6179729669 100644 --- a/hxsl/Ast.hx +++ b/hxsl/Ast.hx @@ -35,6 +35,7 @@ enum Type { TArray( t : Type, size : SizeDecl ); TBuffer( t : Type, size : SizeDecl, kind : BufferKind ); TChannel( size : Int ); + TTextureHandle; } enum VecType { @@ -316,6 +317,7 @@ enum TGlobal { UnpackUnorm4x8; Transpose; TexelLod; + ResolveSampler; } enum SyntaxArgAccess { @@ -544,7 +546,7 @@ class Tools { return true; case TCall(e, pl): switch( e.e ) { - case TGlobal( ImageStore | AtomicAdd | GroupMemoryBarrier ): + case TGlobal( ImageStore | AtomicAdd | GroupMemoryBarrier | ResolveSampler ): return true; case TGlobal(g): default: @@ -643,6 +645,7 @@ class Tools { case TBool, TString, TSampler(_), TRWTexture(_), TFun(_): 0; case TArray(t, SConst(v)), TBuffer(t, SConst(v),_): size(t) * v; case TArray(_, SVar(_)), TBuffer(_): 0; + case TTextureHandle: 2; } } diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 4806c45bf6..f6cf6e9459 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -456,6 +456,8 @@ class Cache { var count = 0; for( a in alloc ) { if( a.v == null ) continue; // padding + if ( a.v.type.match(TTextureHandle) ) + c.paramsHandleCount++; var p = params.get(a.v.id); if( p == null ) { var ap = new AllocParam(a.v.name, a.pos, -1, -1, a.v.type); @@ -491,7 +493,14 @@ class Cache { default: throw "assert"; } case Global: - var out = [for( a in alloc ) if( a.v != null ) new AllocGlobal(a.pos, getPath(a.v), a.v.type)]; + var out = [ + for( a in alloc ) + if( a.v != null ) { + if ( a.v.type.match(TTextureHandle) ) + c.globalsHandleCount++; + new AllocGlobal(a.pos, getPath(a.v), a.v.type); + } + ]; for( i in 0...out.length - 1 ) out[i].next = out[i + 1]; switch( g.type ) { @@ -557,6 +566,17 @@ class Cache { if( c.params == null ) c.paramsSize = 0; c.data = data; + c.hasBindless = c.globalsHandleCount > 0 || c.paramsHandleCount > 0; + if ( !c.hasBindless ) { + for ( v in c.data.vars ) { + switch ( v.type ) { + case TTextureHandle: + c.hasBindless = true; + break; + default: + } + } + } return c; } @@ -705,6 +725,7 @@ class Cache { case TMat4: 4 * 4; case TVec(n,VFloat): n; case TFloat, TInt: 1; + case TTextureHandle: 2; default: throw "Unsupported batch var type "+p.type; } var index; @@ -813,6 +834,10 @@ class Cache { return { e : TCall({ e : TGlobal(FloatBitsToInt), t : TFun([]), p : e.p }, [e]), t : TInt, p : e.p }; } + inline function floatBitsToUint( e : TExpr ) { + return { e : TCall({ e : TGlobal(FloatBitsToUint), t : TFun([]), p : e.p }, [e]), t : TInt, p : e.p }; + } + function extractVar( vreal, ebuffer, v : AllocParam ) { var index = (v.pos>>2); var extract = switch( v.type ) { @@ -834,6 +859,13 @@ class Cache { default: [Z,W]; } { p : pos, t : v.type, e : TSwiz(readOffset(ebuffer, index),swiz) }; + case TTextureHandle: + var swiz = switch( v.pos & 3 ) { + case 0: [X,Y]; + case 1: [Y,Z]; + default: [Z,W]; + } + floatBitsToUint({ p : pos, t : v.type, e : TSwiz(readOffset(ebuffer, index),swiz) }); case TFloat: { p : pos, t : v.type, e : TSwiz(readOffset(ebuffer, index),swiz[v.pos&3]) }; case TInt: diff --git a/hxsl/Checker.hx b/hxsl/Checker.hx index 674ed09c16..e429c7bc20 100644 --- a/hxsl/Checker.hx +++ b/hxsl/Checker.hx @@ -228,6 +228,8 @@ class Checker { [ { args : [ { name : "value", type : TInt } ], ret : vec4 } ]; case UnpackUnorm4x8: [ { args : [ { name : "value", type : TInt } ], ret : vec4 } ]; + case ResolveSampler: + [for( t in texDefs ) { args : [{ name : "handle", type : TTextureHandle }, { name : "tex", type : TSampler(t.dim,t.arr) }], ret : TVoid }]; default: throw "Unsupported global "+g; } diff --git a/hxsl/Dce.hx b/hxsl/Dce.hx index bc19570bab..3d7979d91a 100644 --- a/hxsl/Dce.hx +++ b/hxsl/Dce.hx @@ -279,6 +279,12 @@ class Dce { check(data, writeTo, isAffected); writeTo.pop(); isAffected.append(v, 15); + case TCall({ e : TGlobal(ResolveSampler)}, [handle, { e : TVar(v)}]): + var v = get(v); + writeTo.push(v, 15); + check(handle, writeTo, isAffected); + writeTo.pop(); + isAffected.append(v, 15); case TSyntax(_, _, args): for ( arg in args ) { if ( arg.access != Read ) { @@ -358,6 +364,10 @@ class Dce { case TCall({ e : TGlobal(ChannelTextureSize) }, [_, lod, { e : TConst(CInt(cid)) }]): var c = channelVars[cid]; return { e : TCall({ e : TGlobal(TextureSize), p : e.p, t : TVoid }, [{ e : TVar(c), t : c.type, p : e.p }, mapExpr(lod,true)]), t : TVoid, p : e.p }; + case TCall({ e : TGlobal(ResolveSampler)}, [handle, { e : TVar(v)}]): + if (get(v).used == 0) + return { e : TConst(CNull), t : e.t, p : e.p }; + return e.map(function(e) return mapExpr(e,true)); case TIf(e, econd, eelse): var e = mapExpr(e, true); var econd = mapExpr(econd, isVar); diff --git a/hxsl/Flatten.hx b/hxsl/Flatten.hx index 40a5c382f5..9cbdf3436e 100644 --- a/hxsl/Flatten.hx +++ b/hxsl/Flatten.hx @@ -319,6 +319,9 @@ class Flatten { case TVec(size,VInt): e.t = TVec(size,VFloat); e = { e : TCall({ e : TGlobal([IVec2,IVec3,IVec4][size-2]), t : TFun([]), p : pos }, [e]), t : t, p : pos }; + case TTextureHandle: + e.t = TVec(2, VFloat); + e = floatBitsToUint(e); default: } return e; @@ -526,6 +529,7 @@ class Flatten { for( v in vl ) size += varSize(v.type, t); size; + case TTextureHandle: 2; default: throw v.toString() + " size unknown for type " + t; } diff --git a/hxsl/GlslOut.hx b/hxsl/GlslOut.hx index 96c223659c..095a35c54f 100644 --- a/hxsl/GlslOut.hx +++ b/hxsl/GlslOut.hx @@ -207,6 +207,8 @@ class GlslOut { throw "assert"; case TChannel(n): add("channel" + n); + case TTextureHandle: + throw "assert"; } } diff --git a/hxsl/HlslOut.hx b/hxsl/HlslOut.hx index 5cae807403..a99827ac99 100644 --- a/hxsl/HlslOut.hx +++ b/hxsl/HlslOut.hx @@ -191,6 +191,8 @@ class HlslOut { addArraySize(size); case TChannel(n): add("channel" + n); + case TTextureHandle: + add("uint2"); } } @@ -415,10 +417,18 @@ class HlslOut { decl("int3 ivec3( int v ) { return int3(v,v,v); }"); case IVec4 if( args.length == 1 && args[0].t.match(TInt | TFloat)): decl("int4 ivec4( int v ) { return int4(v,v,v,v); }"); + case ResolveSampler: + var tt = args[1].t; + var tstr = getTexType(tt); + decl('void resolveSampler( uint2 id, $tstr tex, SamplerState sampler ) { tex = ResourceDescriptorHeap[id.x]; sampler = SamplerDescriptorHeap[id.y]; }'); default: } } + function getSamplerName( v : TVar ) : String { + return "sampler_" + v.name; + } + function addExpr( e : TExpr, tabs : String ) { switch( e.e ) { case TConst(c): @@ -456,6 +466,8 @@ class HlslOut { default: args[0]; } switch( expr.e ) { + case TVar(v) if (v.kind == Local ): + add(getSamplerName(v)); case TVar(v): var samplers = samplers.get(v.id); if( samplers == null ) throw "assert"; @@ -501,6 +513,16 @@ class HlslOut { add(", "); addValue(args[2], tabs); add("))"); + case TCall({ e : TGlobal( g = ResolveSampler) }, args = [handle, tex = { e : TVar(v)}]): + declGlobal(g, args); + add("resolveSampler"); + add("("); + addValue(handle, tabs); + add(", "); + addValue(tex, tabs); + add(", "); + add(getSamplerName(v)); + add(")"); case TCall(e = { e : TGlobal(g) }, args): declGlobal(g, args); switch( [g,args] ) { @@ -1025,6 +1047,10 @@ class HlslOut { add(STATIC); addVar(v); add(";\n"); + if ( v.type.isTexture() ) { + add(STATIC); + add('SamplerState ${getSamplerName(v)};\n'); + } } add("\n"); diff --git a/hxsl/MacroParser.hx b/hxsl/MacroParser.hx index f10376ced8..cbea9f7610 100644 --- a/hxsl/MacroParser.hx +++ b/hxsl/MacroParser.hx @@ -128,6 +128,7 @@ class MacroParser { case "Channel2": return TChannel(2); case "Channel3": return TChannel(3); case "Channel4": return TChannel(4); + case "TextureHandle": return TTextureHandle; case _ if( StringTools.startsWith(name,"Sampler") ): var t = getTexDim(name.substr(7), (d,arr) -> TSampler(d,arr)); if( t != null ) return t; diff --git a/hxsl/Macros.hx b/hxsl/Macros.hx index 4e40653ba4..c7db8676e0 100644 --- a/hxsl/Macros.hx +++ b/hxsl/Macros.hx @@ -49,6 +49,8 @@ class Macros { throw "assert"; case TBuffer(_): macro : hxsl.Types.Buffer; + case TTextureHandle: + macro : hxsl.Types.TextureHandle; } } diff --git a/hxsl/RuntimeShader.hx b/hxsl/RuntimeShader.hx index aa27386ee5..c661cccc18 100644 --- a/hxsl/RuntimeShader.hx +++ b/hxsl/RuntimeShader.hx @@ -61,6 +61,9 @@ class RuntimeShaderData { public var texturesCount : Int; public var buffers : AllocParam; public var bufferCount : Int; + public var globalsHandleCount : Int; + public var paramsHandleCount : Int; + public var hasBindless : Bool; public function new() { } } @@ -99,6 +102,10 @@ class RuntimeShader { id = UID++; } + public inline function hasBindless() : Bool { + return vertex.hasBindless || (fragment != null && fragment.hasBindless); + } + public inline function hasGlobal( gid : Int ) { return globals.exists(gid); } diff --git a/hxsl/Serializer.hx b/hxsl/Serializer.hx index 5ed2450e75..b7ddb37f23 100644 --- a/hxsl/Serializer.hx +++ b/hxsl/Serializer.hx @@ -106,7 +106,7 @@ class Serializer { out.addByte((dim.getIndex() << 1) | (arr ? 1 : 0)); case TRWTexture(dim, arr, chans): out.addByte((dim.getIndex() << 3) | (arr ? 1 : 0) | ((chans - 1) << 1)); - case TVoid, TInt, TBool, TFloat, TString, TMat2, TMat3, TMat4, TMat3x4: + case TVoid, TInt, TBool, TFloat, TString, TMat2, TMat3, TMat4, TMat3x4, TTextureHandle: case __TUnused: throw "assert"; } @@ -173,6 +173,8 @@ class Serializer { TBuffer(t, v == null ? SConst(readVarInt()) : SVar(v), kind); case 17: TChannel(input.readByte()); + case 18: + TTextureHandle; default: throw "assert"; } diff --git a/hxsl/Splitter.hx b/hxsl/Splitter.hx index c7b9abef7e..f713d8884f 100644 --- a/hxsl/Splitter.hx +++ b/hxsl/Splitter.hx @@ -353,6 +353,10 @@ class Splitter { checkSyntaxExpr(arg.e); checkExpr(arg.e); } + case TCall({ e : TGlobal(ResolveSampler)}, [handle, { e : TVar(v)}]): + var inf = get(v); + inf.write++; + checkExpr(handle); default: e.iter(checkExpr); } diff --git a/hxsl/Types.hx b/hxsl/Types.hx index f132f40815..1f5630a2c1 100644 --- a/hxsl/Types.hx +++ b/hxsl/Types.hx @@ -8,6 +8,7 @@ typedef Matrix = h3d.Matrix; typedef Texture = h3d.mat.Texture; typedef TextureArray = h3d.mat.TextureArray; typedef TextureChannel = h3d.mat.Texture; +typedef TextureHandle = h3d.mat.TextureHandle; typedef Buffer = h3d.Buffer; class ChannelTools { diff --git a/samples/Bindless.hx b/samples/Bindless.hx new file mode 100644 index 0000000000..475f24e549 --- /dev/null +++ b/samples/Bindless.hx @@ -0,0 +1,109 @@ +class ColorTexture extends hxsl.Shader { + static var SRC = { + + @input var input : { + var uv : Vec2; + } + + @perInstance @param var textureHandle : TextureHandle; + var pixelColor : Vec4; + var calculatedUV : Vec2; + + function __init__() { + calculatedUV = input.uv; + } + + function getTexture(): Sampler2D { + var texture : Sampler2D; + resolveSampler(textureHandle, texture); + return texture; + } + + function fragment() { + var texture = getTexture(); + pixelColor = texture.get(calculatedUV); + } + } +} + +class Bindless extends SampleApp { + + var cache : h3d.prim.ModelCache; + + var rockTexHandle1 : h3d.mat.TextureHandle; + var rockTexHandle2 : h3d.mat.TextureHandle; + var treeTexHandle1 : h3d.mat.TextureHandle; + var treeTexHandle2 : h3d.mat.TextureHandle; + + var rockShader = new ColorTexture(); + var treeShader = new ColorTexture(); + var rockInstancedShader = new ColorTexture(); + var treeInstancedShader = new ColorTexture(); + + var rockBatch : h3d.scene.MeshBatch; + var treeBatch : h3d.scene.MeshBatch; + + override function init() { + cache = new h3d.prim.ModelCache(); + + var sun = new h3d.scene.pbr.DirLight(new h3d.Vector( 0.3, -0.4, -0.9), s3d); + sun.shadows.mode = Dynamic; + + var rockTex1 = hxd.Res.rockTexture.toTexture(); + rockTexHandle1 = engine.driver.getTextureHandle(rockTex1); + var rockTex2 = hxd.Res.rockTexture2.toTexture(); + rockTexHandle2 = engine.driver.getTextureHandle(rockTex2); + + var treeTex1 = hxd.Res.treeTexture.toTexture(); + treeTexHandle1 = engine.driver.getTextureHandle(treeTex1); + var treeTex2 = hxd.Res.treeTexture2.toTexture(); + treeTexHandle2 = engine.driver.getTextureHandle(treeTex2); + + rockShader.textureHandle = rockTexHandle1; + treeShader.textureHandle = treeTexHandle1; + + var rock : h3d.scene.Mesh = cast cache.loadModel(hxd.Res.rock); + for ( m in rock.getMaterials() ) + m.mainPass.addShader(rockShader); + var tree : h3d.scene.Mesh = cast cache.loadModel(hxd.Res.tree); + for ( m in tree.getMaterials() ) + m.mainPass.addShader(treeShader); + tree.y = 3.0; + s3d.addChild(rock); + s3d.addChild(tree); + + rockBatch = new h3d.scene.MeshBatch(cast rock.primitive,s3d); + rockBatch.material.mainPass.addShader(rockInstancedShader); + rockBatch.enableStorageBuffer(); + rockBatch.begin(10); + treeBatch = new h3d.scene.MeshBatch(cast tree.primitive,s3d); + treeBatch.material.mainPass.addShader(treeInstancedShader); + treeBatch.enableStorageBuffer(); + treeBatch.begin(10); + + var rand = new hxd.Rand(2); + for ( i in 0...10 ) { + rockBatch.x = rand.rand() * 20 - 10; + rockBatch.y = rand.rand() * 20 - 10; + rockBatch.setRotation(0, 0, rand.rand() * Math.PI * 2); + treeBatch.x = rand.rand() * 20 - 10; + treeBatch.y = rand.rand() * 20 - 10; + treeBatch.setRotation(0, 0, rand.rand() * Math.PI * 2); + rockInstancedShader.textureHandle = (rand.rand() < 0.5) ? rockTexHandle1 : rockTexHandle2; + treeInstancedShader.textureHandle = (rand.rand() < 0.5) ? treeTexHandle1 : treeTexHandle2; + rockBatch.emitInstance(); + treeBatch.emitInstance(); + } + + new h3d.scene.CameraController(s3d).loadFromCamera(); + } + + static function main() { + #if (hldx && dx12) + h3d.mat.PbrMaterialSetup.set(); + hxd.Res.initEmbed(); + new Bindless(); + #end + } + +} diff --git a/samples/bindless_res/rock.hmd b/samples/bindless_res/rock.hmd new file mode 100644 index 0000000000000000000000000000000000000000..46e50eeed6aa3aef0b1dfa843463743f9f10631b GIT binary patch literal 7956 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⁣99-C2wp#m^uJvn5>)7x7UO zB70ZkKrOL5W>4<0Wk$*W7I$rjRqf^C54xGz}3?PY*xm8yQbl%`xZk zBvO5;)Kmj_Lm!dSsd5CMW7teYO$NKmSEyp7wqaXGxq7cXme)d@yx?Fsr1Ps)T29E0 zbGc0KfUYn8TRx&+R%H*-WS65^^e`9UCmjw%x4g&oU)OYJ&L)g1+nMxce|@ zZq?DBjJmn!C%O=ntF`bk>D|)|l{-r*vJB!;VPGR8YSP4SRbC6M>bLw|zp#nqT?G#^ z-rPI(6jEFekT|&rx9RptkCm2_`K8NN6^{&v?<2!`a}N2cY!qaXzL;d zWpM8r_(n`prLpLwzQVWHq)7t zp_scgx`gC(8)~g_$7?GsJPC4+-Vh??I0r>3*o74D#>!CwvWFIrQg z@?u{G=ThF67ufLs@!Q`N#r19c-TCs|F@}Q`v`pH#K~8XB*=U8L-p-2pfyJv^)-5BP%z&JJ;4l z^zp)3^%_Zo>q${vQL>`DUK~_dtkaiVntS17j1rjzWt{B>&{pZAN;1I>Kl)7Z=8y5> zds3Wf(glQfr=^@gYFK^c>}+!yT^6wf3Y8o8y8ghlKmiH>J3O1^^|}MG+|94AR$`Jr zmrFctHMXuBoUWz~R{jJZ2si{jmKE2L$M)RR99Vj_stC6^eNt{;jS=gE%OQ`@8COR+ z+WM$hA?8g^RZ5dmz9#nr1~NGbKKLcsQEVYV*@>NeZ4M2eY#5W|7WwOCj=y`)>CKuo zJ$}-T(D~Ht_}DvW)0|M&UP0(rt-6d&P$&cD%|789E&Z|bZv*pY&OL*buceNy8XyRm zf6k(c^@(MLh4r1<0e*GCe!pgC3N4fB7u};qOWhg5Lq7EPi6d{ApG2E}3@xy+l^~3-nxs5?BV1 zJdV}#SMv<_K-}=qc#Q|ol4qC8o7qh&w8Gi9}A2H+{bHx)Zxjt7dykSjIHYJ>NQl}C1_ci7>wVAbw>t&VYC0>Q_zY}_V>$U#HK6+u zR!J%P*Tp=kCyB=c$}vqve)O8Gwdwhy0lk*#{o+SGaz2|dhgE6%u!OpWlxiuGVrhEQ zkv4oQ)MWM%7loCHX3msyMM5rmU!YV+Rb5CKi`D+^uO_2I(mwIJvIP)n-CTW`CX)Ny=~qFR(4 z5Br1Ddb0LNlQdJIw=T?PuA^DL>e+gA?Zf>eivkNx>|6tj=r6~tTWsq!Uzh^|xe?pG z&S`Af*hF5Q%__k^{g`W=w(3+%C`^e7SaO!&N+;#wZfkaa?Z&VTRt_-)-7?yLy~0U&1l~@ z{ofg>y{gsk_HGptV&$|y)q2bxyJ6aZs!ncAwVlAmoc}hu)mjF%j1v8o_N>GBUhyu^UqHO4ORb6H$9e(h9zYZ3RY!3y)K9E)>~+ebschMq9(s!XGjCsPiwNFE2HAmHQca(A{*Q)kFAD zZ|phVk~G!xFzq)@&yzIiL?H+KiK%?D%D-gkJnU$6MlOvQoREzAQJjm%10%;kFdB*8 zJsE%WlbwF0Fx+60kxW?HLRLf`@QS~WP}q`=r^(6lyC`G^Yk%%M@&so8z=yZfYcXet zz8-G#`Vw9P-!6h0sm>8xjY6PR{u8b^h;K=?`uj8_Ten1H+nxCW285p{4zyi zL`JP=ZHhBvTb?i$%BX~ZIj*VmNREt3NVKyD;BU$88z<4)r#hvy!$J?Grt$=Q*qZaD z>u6`J5^Ymo82R^uSM?5716KxVJbh1t8d{PDyyVyq1wrtf5@L{leB>rfvvWWzuCyFE zD1?!8C$`ZQ{8Fu92q<>bsiDc-Af8hYDh{{Kj}1a-%I`Ku*Qc1r&ryKFs@}=>`?%=$dqsPCH4hruqm5IDGDj^o)0RN-p3apo z-f}u>+<|duVv@LK{*(vDtSUEw{{j|XP_}57PrFFJvpIo4Xd8X7()L{aubr(J%lg@w z7SRi>%)S`2uDfBYBYCnaY9MV|tEhdmqO%r4>yf>;m9Gi0-V|=vSioS zsmr}4=2w{@rwEU5NZK9D+Z|uL?H6kEn(~w}LW07UrX&=IdZB7Xr2u+?r7!3>>{RoZ zInvv1{Hu3fY@{IxS+P?8Rk$eR1Nqa=fxF%8I*)lwc#Jh7B+8vasN==m;woCwmRZqa zSFD082d9pp0V_3OH9F3lY(YXp<1e%p@cgt zB<0Sy;Kc-)CM_j%B2~AP7qDa3?Gf>=mZWh!0;fa@vo(|4Yr^ZdHoNOm8`%W9*|g$G z>o=2H@Q#$9UyLljMWvnAEg*hu=NYnBueq+7CGW{7?)o_c zFJ9P@o7SvxVU#eUl|MdfP6Ama`Q4w5YD}L{p-NXX#AnK`Fx8G)0&Kp{*d&r91Q!ay zK9^$2t{saAhYh}VKdAI{q9yT+GxHPP2K_>sMPyY`Axvt?g1TjYGHM-qr76Z2zXzt*(4?^}`lRO__TYGiNq!rDjotUXh@Cj|wp(Sg*gP>-$!yvrW6`{Ubp-AxLM_ud4)t1gMl%_H+3fhwa?h5pNoLa9t&PSZRq|4-H$*X!axH*%gObiO*1E4$BzQoAGDu0RKsuG2vVPs>(E zy+zp7q8y&L(QVXw+Awf>cp)jiI1DO3emM{E6AGahkAw;70f{ z^}_8dgD-LXr2DrE{YqpRosgmT{O#pL5)tjn)vu^ypE@{XsSB^%H3D1_J`Xy1m^`v? zWN9*Bqf5YXj{oCEQ`J}aSLF7FvSy&h3lLEH~MWZ5XFO8KdMB78&yoS<&o zKyX1WyV|5ei~(<;dX-E$Y}#+IwSvT|0}!ftxJSpw&wR+el_;C(B#RIcY352n(W09a zAEI6+0Wck~?U#FK&5Kqq3g9ayhOeJL!JfS5^rNS@?6-=3Qn|GlMI{u<&^)GilHuc- zf?~Noar6(ORua~cr<x zM{>}9=p(E(GUJUCa0$B;kvDfa!%(j-?*@Z)lSqkjv?gxFRou}@LT{T1yWi!0k>JLj zKks~(a^5^OzDkH`w8)VDX`WYSn0Tou=BC>-Ga+&*q`=dRc*dV%633}YnGW#=Pl0(}x5 zCwF{#U*;L|w)USEYk0xyY1wVnAcm$h(!|BeTH?{WnT+9HgHy^2(&mmn{+>QUOJwBK zeEvk!erVb>Z9PE%3xH7y!}uI6g-Ho>js7S=F8*VhLj$cxpbwr_QF401Pw9!v@6(ZM z`{l}nqKbu(10$I@Aq1ejVZBXOyjSSJ1vVnXFoh5rHLI_g_pd}Jxk!)U0D zT;_iJhp@3xF5W4md@gOGa>+X2!CvxY8VvH@t;7CfRu+xKt0Bfj)?zspY--P- z2V1m8d2^Q!@6!c(IGUc?0ESgN86e336e=P@-?EoJjy%X)8_CNQ z=Op`TB>blN<%Ae`vVbfdrgQeYoFvtgGJhxcr?-z!&yba=>iB`H(qF(&yq|BiC^lJD z!_vwzmwfbTIr4I);j^A(XOxMn1ol<>9up!|Lpq|aOm?6EzUGuh9-pxBeAAaw-`H;^ zO&G1f=4h|TN*;N`8+T)xyB}C;KDHu1o|!%n8nB4j+CVCjM%t>f-!yWzd*}LJmXf=< z<1imT)tfKxHG@*9=ppV#YDTEtmkL2}Gk@&6v7`e9MfI2LZU0>BX`u^y^t`Bs*Zq5( zi7yzg)h(cbbJgcmi1PCsQQQ_oLFgDu?zk^vOqX^97=D*fx7+`6UwZLbQr5)Y+0@S>R>@<0Nw~RTn;a>*mg?K#8UlCYA5) zXY>+GS1B!trv!U@TDJy|DYnlYUsjuDNKN?#q7l!weVCASrsh#+D@rHls@(6TJEC(o zCqlo7GJS?^km`g%=wEqp_3UW65xHa$(DC1OjmAYu;`&de)Mj)CjKH*d_=~7#9iUjy z)^Dw6T*qjh-@5myFK6^IcU8T4`n03CTU!BZwxcn~=;!?AihNBDhLw5LtrAipK232P zN#@~(C(IP48g+S)=h5ayZZC3n^w^~X%q)G>TV3izlzN8}ie6;nw?#?Uh{^l~ggV`hnZyTp(gSlEcEk#CPKB6uQA>8a^z5y@Q4 zlTGhn{$P%`)#-f!Yt?e>1jRD?NrJkSb_mC#G$wV02*bEJKNb;Hf z_unE|VlOqgE#|gUN0a3E6WoTPIck=zRY=6RB!g|ZU%p`*M!ZI(x%ItucpEAufeRj! z7HNF?*`@QEx?TL}_>?~v_&=a}nzvGHHe zJyViAnH}1=?Ccb`UN_FPv20tz^BG!Z$lKw)VOpD0VQnfHXsmV2{4t|VcRS+d=|I`8 z7xS*B$4radx?XBzrdn}GWp=kZWR!b#X=txKPman5Bhu~=CD-gj5q!jcgDFVd)-?Cc z-nY~c#dmQRA|lhf70d?FIS^`FVMu(5^pYB~0FD)bBfWlcq5PFmu<-{zkMEX9C~C(s zP=a7~Hrx4Z1k@P;;rk(}>E9ef83C})rc`+|PaFG@3&DQ9vFfoM`i$Ir^L)^7xLLeL zSJnp{W_wC!KoJfobo4RSc6@7aUjNAZTo_}jH*FL(LyDPZn$hA*Q1&-=%%*B%!Ap{> zr^2D1xWzvDS9}W!=c#h>xD<6QmOz+!yVEPzk5@WFY<~fw2Dt1G_7bZnszxs|5_pB& z>yl$N<-ypZT;T?V^s^d=IZ+_ghnpVV@+mqBtDNnxH)_Jx`M%lbv_{&aWAGwoJ)r!L zE+^5@w2XWi=j9=RrIE-$x55PnzIx@l+#gRI)I6t1wte66tWZ*qZ1heT zk6x%&K94V46GUp-z)!RKfx1G&+z-ffh4a!+n{fV((3wrImfD%@%}?QbS$U>SEh2(Emy3eh>8~Q#DIE6p9*nLb#mU2_WyDSETt~|q zpGp@5I8c}Z2Wg^6OXi-iZBuOPu>uA{UF%)QKz=pjj#WgBzmgJk6j2&HPSGu`g!QxU zm~4)L08zYz{VFehlj>?K8RmDqqRpJW;iQ+Nc)r)x}~czQ0QO3sCjU^5&Syrq0rk$#|`=;ixrs8bzRN6gA@W$ zo1rXfIk^{c5LZrlLu9YqV$siBOR(7yl^ z)oi575evvlS^1)f*|@Fv)?MgD+5*q6amr7pi5H(N%|ag_g+-1(;u6_YT;=Uw$~j34 z-#w(L8Lm>dXCl}2g3ur`YJTUWvVK*mS@!a~% zzFK>kOLnJCLPBrz)HaLr;Tq00P_=SgUQc0UCGl+*a(#Yy^QuDMloh+g;nGa}!EC ztp@&PT@Q`v&-3Ky*EQg|KcjV#xku=s^ne%2pucskE>jCG$LXxFdl} zgupu8wXW8@EFk{J#}?}&k5f^~>`jBYC|NeGh>hHWSbxv=ue-@)bBqe&t~I7>m4*rp z^U}cD>}=Uh{y~fk=97twJ$=kf_N{?Do)BH>a@Fok@?0>a2j7oO2c#xv1b^bXYC;{w z&t-|}V3dcRwK6I`$3jL%T&~E|A`*KbxpdM#<~*455jd5i$rou2O84E2F--AKYd2QQ z=2wN+$@j<=7z2GU68zayxH!u%eOY1Ajd@ls)@F{vl*QODBY67BhkI5OLjIsshm;=v zj_lXgZzqdBNpS*@JR6FK!Zoj7C-vP~ERhT$`u%WteFX=mRF+S&^QE-f{#c|G zu~rl5AzJ+qZL3Mg4hfziw3_DHPX(g)p&ggtf0^ljxZi2n)5o6k6No^z6&95L=~M$|#X0J{G!sbH z!|go5zW!)ps996qF5D~J+iU4{S-yXDl9}eNq;7tMM3o~Y-Uhv5n!i?9qdccg4fy+O z`FOHm`0KQ1n`LdjJ1a8{Ctn9%O3R|&)i2OQoqMzH0^7i6gJrVHD%X=NZvNu zqpc=@?%|ovn_bM4jHLWP+q|9QhUQf*K}U1Pd?xIV=_sOQqE%lpbk*w2ql~&n?i)UI z^^}kK@%xs~(Dd<^IKP)LdaO+U3u`fxPaWp%CIYp3uRm6w>0578R$rx*zqzqmVAlzY zh%{?Uw?=BYViU(xgtn^pJkt+K*0z+yqk4C#^2D^*IZ2pE{NTN}PwvPifoF176IOd1 zo57ALw}ykDl4Ycxsz~oy9NC|lEkRAZNa0-a;9`0LUwQyo53n9=O8r3Cvz74quNZAP zhehPd!1q~PP?Kof)+vdQNiy!HBeONKoYnn}n-lj-+);`0ivp8)*3|{xAX&XzQy4&+ zXCn&JQNYS)CGi@{CN=kbsZA<(?3)j;4DyY=*!l(a+Q$gy1nu`V@_!r~zu5)r{AA=> z4HG|Zc$w*$;fse%C(gC zW(J3!Urw`qg$6l8ovNWmhUphfdBO252|S>Q7irta=yWh3@Co!#P=J}oBS%(K7(e6w zmi=WK5eg$;TcCTl+?79El6Lpuux-P}=GUo47r}F#c%=g|=>vGEraNilh*tMP0HdRi z{FDAv{1a}+bh0o4xB-ce8xdPskYsj+9whp%rfNOH4>FlHdmLpZ;K9hO%Rz|M^cGr7 zm9bR&Wqo~o;uub~o>zoSDoS;DURsl;2)}d5;voMk`LRIe5($PEzkW0rqQ`- z86^g=(8ig@+8fNywYT}ynYw-)*dJO+4APoQQT<4xa=zQwO!WFMfZ-3VeTa)f)wiHY zdpBQbV;p~+j>Sg3-)p3~OJd|h1GXpkzbd?s_zUpxWLKJszD=-sYtfLmM4e=J{rvnF z-EBl%TiE-pqR@#l*qQRfN`5MP&hs7KtrJt{l z5suy%2f{?&2nXz|HDl^E+26&hhASug>Zm%W8=UZW5q5AQ7(?IO^0))g2w zU96~?%J&c#LNFweIW4_NM%Z^~J92;M8#>%)2Ys0eZFpbtBi_ri#4u&mP)H#p4GaYT zq~NN<{|iWLC>#p-VtcR5`o|D6$#<{ywYN5v@oaTOo8EO_djeiCuRYGuU;*`EC&Q*U zkSt&I>K=TxMpP+ir;7%0(D!TcpOY0G*SVwxy7EL8jqJUO)7rXU@r0fj3rq#30+4!u zT_}usMq7w;P~hM4eNGm3K%@EnQ3P(*Wc@*h=hK%YpRP&8i|16ljGvJ)HvG@6b*PWz z#K`=))iwQE8Qxg7lSo3hG7N`**+>Po{B!H>fTNmZ4_`Y97E?yY5W$f>AgjV~cUnF>M=YCU>&aPFK0eG{zhBt1*s(p!qX<*iBRf304JE?+tfwa=% z(%-+##&3$gNY{%f(NuDh~`uY(GD`J9)z)Qt#qT+OV0!xbzRCfAwLw=+e za5LozYt(L$OGfdy&XRxh1n0G7RRl}Y$^Dccs-c$`hz&MJ)(>N98^rC|F;O-Y$RRB* z>f!!U`geT4UAiIN->4pKZ7pc-zdT*+nAbR?5KJQunI{wFd=AkfMxtLK1@BVpEKUr| z$&NoKl7-yzN1CXrb`xDMO#69ze0Jtj^zs;Wpv` znqFs)mjUjVgcCztykm1oz$@*V#^8P%I{tA@CfDrj+LR8&v;Op8dVh;2@XY&hgb^aa}?iJ(SN@{fgy%`A~QL2d&PJ zpMMheU2VR34CFWjgdX0OdH<0MPhF`G@9aL(O3)D_m(L;?qZDdOQwg&<(=a7`(=n01 z8cPzVR!KH0VhRfta`?&@_CzaOg$T05joZj&t{)5?H<%T!u1jSFJe95PU}hDTX-g;F zekS5);K_}uA4}Utq*ZF_Y0s4*G@DM_W>=w`H(g49SELqb65ZfS`*YP13) zML{|p-AH$Xi2d#P-oN{|?Ygh~JdYGH8SdIjbC)ZS*=vKOT!0GNhI3rT>f9_!#0u(# z7OjDK!)JF`ZhGw0hIwxvt=es&xHrsZ1H-6Lirb27L&vQN^a8Cbm0grx7j7n<&rJFxzL=@=v=i>=dq+ z{#4{T`9>B)SB)CU*lyd(@dp-mZ>Dq~7J7;#W5;+D$|SVa7fqu_L3lGzHoZHzn(MT-L2-*RLA&LeN;y!sVVVKh9Q1Og}A3?!n^$xa2PzD;#Hg286olUN9ZJrUC~ zFJZm!(f25+AK^+)QW0=E%uE3njbtS#A{mVv^YNkX%Wp0E)dW`2$u^(UQE!zk?ZRsA zesQ_Hdb6-HkNtE#FSR@GhNbKKz&e>18o#rXKC)w2`%7$NdEmVVwu4nG@KHO``75_k zi+Zpx4k0A`=;g22PtH!=9A6Y|zA^GUq-02CXfoM?B?syk zH$OCVHcP#GR(|Oy42pG6HSpLCdX1{^=u*G^bYWbS(4;ajT?*MLc=p}L?rW0!G=0pH z^NMB1Rqy>S`WEu1iAzf?%S*N??=)7zpSaHyPuqvOSZem8&Y42i-EJGXJ zU@l+yGMUXNMHQ{mWd>th-#WU_Ga_q9%S`S=-yhR@Hn~^xmz3&h9m(J$6|TV$U+$$% z*bTS6fn4g%#|JFB99uyX51QZi1jPY7MV{4%8^TNR%n5^hBJV{*J~vJ8GDP=hCc%HZ zUfeVUxuq#Yq#=@a0Lj}sMA-<-I~}0uvH0_U6DQRJp3VTWH7$3{9#VwT^`t69^{o8C zzF`*dW1&CsyOVB2K~P70%gn@(_OV&WY3OG^$(&AA9%=Q{AuGA=rxC`p7OWNR&-;q; z=5}#{Q*L*{yEW?6$#99_rMX?Lu&4w~?Qmu2DQy4^cSV0s>DqHS@kysj|6j#bft=a( zbiQ9@Pf5mOr7m<%)uC0;I)Nn>zon(6&vT+m_k#n@saZEe()tDBtdwMWdBgEmJzF$DD>A1i7-`pxaX~xg9(^kb3uevJ$D*ca)bGJaY3A(5 z3DppgFpTOC;PRG7|3q|M`xMBF|3q2|Ae)yv3-A2L(!slBe@N{u#p-MB=-QUA_j29=J zNJF3JhTj0_tJAy*8h~>Va7xlPxp5>HZZ|#EeF*1bNYLtQ43y}ppWz}aavd`z1JBhb z83aI*{rO`|YX^=^5L5B392c6J#DTC!_dKmRk{TUI$S{`8W*MjHk;j0ZlnqndJ~}6O zqqQ|<+RpBSHnAAxp8WYS+iTPS>YGpQw8MT&1^L>dkD&M~Sf@u>0~|tF8Ih>&yO&@8 zd&~uKnM*ue5rLkaYJdDTWyqtM1r?EgCeG1{KHY%|AP9HE>&?z*+2+q!nY`c}`n?>t z?7c0G_t+M$y@FUSHWtmf^n1o$z$+D^?`#xPS&(;wcKDG-bdG)WNMeuX(&3Ksh=VY- z!=b;0KC52e>~Wv^+3jHt!BKW%BU3S&cPio^gE925yTZ(U1Orje%3pCE+S@=DoPGo$ zpZE28LI9b^{s0M;QJcbp`qOFjKLFc7hN2Wl$Dc!i@6ydw0rlR=^r@pnIc=boO#VCn z0O;$xkFRLz291!zV)P%n!jW`e4+$%GL9dJt<^y0Wnw~G#N?p}B{D_fqWtkE60rOH? z7`1h*bB{XaS~PdT?wc-uSY3AKA~|wFd(2?#Cj!$?Dxn%PP#)XHkr&V@Mr$!qBmJo0 zT)ndhKiJf$D{UfC=_rLTg_(#uB?WZe%r`x|APB-|l1$bbf6HH9WJ)wirwJfG*YJBCRN8bT8Txr*xv~j67O4Z61=4 z2qKC%vnD>HA*Yr22NwShAnqRJT{tL2NjPTj1jQ0TJ1>hJr}aEX z8fisI!>Kjs^-B@wZFuogG3mSA%1=ktH3oirc@vQ{#snv;=Y?OMo6Bcw%G1T7C;&bR zH1Gz?zYl%~7-hKq1Mt4YO;m=izWdzPPnCXrqVNIlmGbBc-ebeIJar^rugS0L5p_)F zr5Q{Oh8eKQD$LMi;QENl5ihm}o`#7qM%Hvh8#tf-Kr%&8l-$pCzQ*(>89uE=n$natqZ9irT}Gkq{F{y(o_rj()(tzn2EJO_MGr}SiIYjY z->G|{eSyz0+QVdd8kXo_1C|r=FBFF8a@iF=B(M0w`~KtHC>;PG3l5g^T($)Q=VdOBw;yDt zHES7w%7; z6*?S_<-m^^S)@RMV{?=w8;%4{A8><{01}{#rc(&he45E2JlJvAG5Hp>NcIjZ86D6W zrK|u-v?RPFLIe_++tP@Gb-(C?aYuL7snHm|(-q}AW# zL6G>o9<{4_78iG&OakF5)YuGH+VsQJ>&N-to--YLZ)WQEtd{)qEHZ9kry1MCK8j8a zA_oc?a;}Fz_0x#hMjw$YiopP%F3Sw3yD1qi&!iIJD(nKmU)N{HYG)MEQ#< zdUa~c8(hoU66tYk#3w3HO}(IzK%s8mmVLf?`ntam!;%Q)WtYq)kDGFIyvUBTeX8sWr!n_GQTG@U{E zh23+Rx?0U1L6)ffx71BBQ-qw#;n-BRaJl8t;;!rlhJ4vJE+T$wb{V~DL*^o}IGK{h za;?xQhVZl6<}d!Kcojx-{b5duR@=w>4}GR?;#kfFB(SiJV-#zwEFB&LYzvC`hGTRR zD2e|CXU_%-h0znAp`=loPYem`2nx59dIGYWC6i3zZW)n?1)N(DCrp#G_dnp7j_%RH?x7 zNX@&=qHCt^KYb)@krc{svG)2UM|Ue_v56U(@Do&Y_c8E<2nuD$*!Ts**1-rx0&zO4 zgAsNglgxG4PBdlj<@^QWSRMkhaO7)#PKEveafXRka{Kpk(MzucW6Jd1?hQW|j^~Ll z+}ioDabu^B__b0~g8VrXT$iO9c2cIOYMJ|z<+kXM^u3DB*&ed^yk0`wgV6XT^DN)T z_DQYaEfaD(5CzQ4%#gn0IltI*n*z~sU)-CtXA;aLOu=p5hL|d-sdYF$sUz^bqDExX zq&Y?#Z1&ZfFWz&PoWjc?8?o1I&dGgo8u5Jo41LfdF4Z?r6ztEy=eC3pxU)$X9R{gr z-_x$wr>QiGRee3ZNpHO%dSAA>Jydg0dgnHwuXyCBWJ~P3g2iA*WMSGIs(KL;OnWOp zzJbP>**J%+XP+ZK%QA=@b|1>5=YDPEiwBg{-AluH?JlM%lf`&3r#S;H83n znP9B}@N!8@MZ8mThgRELkU7U3ZktJQVGZjE5p5gL-W%%fv<_dQWA&?{|J6?Q!5bNh z2Dq*iOujZFyu06*W52Xhj+d4?v)6;nwL%+_dLvEFe#J|7=Wq%3yUJpS67q-My@$*U zWeA?v33C_?g&j!E;Y7s6>)rq5vTVJ+z@rNIw6_}^=p3aahfZB09yg?Sf_$L2_Nspdl6d!ed(-(805DC;vYH3&tCHc`~x&AxI^Y99tX5- zuB6RE?-lG8^-B)H6j}|1>-ZBbSlAI9BZO8ExLA|Z`+gCsb1mnL^yMc1DbBj5z!H*iI-y>nNCH9K%tV)Isw`pZBHc7&$rSCw_qQ7(+ut3wA-|#B@?ZH;piJ`nK~0cYC>}e;3{DpF!KeyvN>(NL|k} z2yt8M{m-;+YJP0HTGLe%B)&~kYa#ow9Vo zBWUq=u$e)>Ggi%AN)z+Gh`(v44oZyZ2+WD|h7V|;b6uIudZeHLb0?mJa-}>XZ~aix z(=FjY1&Ox)=**wtVPA@eCI{aWf5O=z?wUd*XqIqv7whe_KOGqWFS* z+AeigypL5+rWOEntFd;Hbd&KKUJd;DE7PF!>JRF#@R4>8^FM$^?8Vp0nI{6Kq(xM3 z8Q#}}Aw1{4b$@vqD2`Uis_?OWhkn=fb>xWwbkb{^()Kic0;R4o+a&H9Je#z{M0P)S zFKb^6(MCoD9gQR!v{Uki#fI-eLTH;oUF1SG2l$K*mlFHOVWQKnst+ncisHhaW5V$Z zzF7iVP?~&6?`a!SP7|-Kqxn6^(9=$*2_=8uUDHcJP6XB1H4>O6@?Osw4S^!Jg!~@R z8|Aq+zb1|8>IgCE8 z>I%u&&F+_cJ}&3v{$XX|8K4amZ@ub#bXlA!TFJC&F5$~L>u-_i^|B*M+TE@qv0NZg z3Ll4Ycjzz39LRk~r0R=JB79YX|MSdk*XPIp?E7TNCkcZx%g~u?pUB0rK>J5OSe`BY z@>C1>xKTz%CZ84&XJ{u4i9RcSH8YR;fxb`fxB5<$?$X%fkJL~v39%B$uEdLn7)BI_4Mz&{h zK+eZ{Ex^!b$~!0%2WQs@2f2)af!O!Sa0qBF9KgJoi3=Y5v)Gilb?X(F=HUP59_I5= zFs+yKKR`CWwh*gq#t^3{9zMBjnjhB@O?=I%gdyI|qRb+@XGqAcNqC9E9WdUft(g|| z%W2t_Gx)6y|B_$xrTj&5opu`&wmVaa=D7<2E#RmdN6?9DTVIL$7zu-n-BTp1F`k8Z z_fj7oRPTy6vX}PshYnoqK^=jumiut7dH^x81)b{w7&Nz4wK0Zse8uw@vX;p`{lc^N zXKCCY!yb;9cfQ@}zV~=;Z7bZ06^|Z%a}KTq+vz7D*Ea3;6#DfGjqve)a>Kg0E@Ya& zLw+z1LfQj&k|y#4rddr7rk)P-1!)tD6l$@7wN;RFEOHVCwi-8?!E@3j!x;#-n}^EU zoSr%(nUC2XFjrJ3ZFg@)U=q`Ee{NY@C_DdUif3el^we=r8Sl&;p`VRcHet0VDtfVP4$zKTNiE2Z9jwI8`V%|n* za9#t~woftDeo9dMtd~*5-~7v{y4qN{u^lwC)Qt>uz({YWcdgkuK7Ouv2b=L?;tM^g zXmTck+1HoEp!IIrMKk-Oeecbar7hkQ7pK3ux9>Oa9@gs-48cIZ;P_Unw8@4s#7$t?QrKNfJmc%V8Cmp*m$ zZvN}c#SuK5N!;t1U?uCT`5A>{N{UaeclS@<5cYBZ9)2?mEI!tcuzVfyGlf{f@5)A` zX(SMT&Fk{O2OqeYSWmoQmak`c?I)AM2gKKt#3faHZvUyS!^}w)5{bfr6!?6mlh6!R1$4&wIMuR%%)sX0z)d!u z@QS8aixgJ*ihi|5^}t5@-VO^Z_ob9<+&58Dsj&_o;*d>=w9(*)EVJ(Nw|<;%e+0it z(c%A)4~SsZCl~c;VpcxAfAy=p_>>u}iG6|)c3OLUyHk?o{{WS@PJMy}A^8>U9c`J1 zhr8PP$mcRi+nL(g$il7sJMFfgEV!D<0>cQF%K>3{EpNg^ypr*AG8BF$UMnK*GFdgf z7B7#|$8Ab}q0tp)f?=oQvk%h_=Rf-AieI`z%mZbsMNwQf^g1gL(?tfjdT_ds5 zi~k4ErB#ha;WvB14JWS_H_L4CV~UQ*hEc6O0V^7QO@mGh|MTWpqdtKfIRDF zxbs(RDsyqi7gjFs%qoGlT$PFce-QTMH+2;Xw#)I;KhNGiKEH{~n`k4^GvVdqB?Y1U zAL>l{tIOExkbOnbhZ|j5>lDv+(<-$iynKEi=nNjqhBL^?wf7r7Zz-ZGd*mJB{n5|0 za?if3YN3ys-4*oV2$|1-{$Y2$a!g84DkcqKY{snKX@7l_`aH|ZKm4iQ4NU7tYd=;; zYIAbbhO+b}BDc z-*8eZb|KNUb;%uVqbQ!&du3gx)KW~GtW>=zL1EK_?Ql1sk@gY6lP52CBL@^t++X?x zYu$)b8{WT>Yq=T_aI{kAQ7X^|AW0+TC&oZV(|H!0qma?O+oyC1SS^jZZ-1UMmk3+_ z(sWJEw=EH)(G)Mt`$&{;rH#KeRXft{H%_XlG0}S!%~VSva0V41qjoZ0PKK9#8{^Xv z!Ih;8g|20p?>$4k_cTC#v?lDQ@)bY`K}}aIp?@_l)$mqj!rx}fQ%ygm-n$2r zY`f}EkYEI378K%27$#aJ&|j(H=@8g53{M6;dh^VUJHw4Q!1o9!PEC9fu<}Lu$b>;r6GnI? zr(qN{R-_UX&=tH zM=2`t?b7CpN^{~c55j3-y|71RVGf?q3VCqF$4{3~NvGvcbCvv&<jZirU2qk{`~9dQbDVSjgVquHVs_ zyJ`GYs&*R*pZtIXB{$6M9fQ zICGdYKAug_b9dU)Q5zz2JXJjk`cF@Z`i0L2)%}?^c!Hl!@NWj-)Aco3@B@?l z=_ji?S5X4~-eAz@gv0BCy=SwDP&FEJq7|l}FFZt_;kD?0Z=Q4<`L*qXN9I+_pKG;5 z6#-sGhU*b6mlL`zL(t*qIvdW+A7w9#X&wv7Sn_))HLmEIzT`pt15i#$G+uLBz5AmT z`J|B8!FLJ+Ro$$H;5nNt1G#UnY~V$&bHbqlzBTCM2i7EyMWN;1N}<1=QZk5A)<5RS zn>Km%gU;-MijmcCLodVt@Ny*#Ymq83xN0OnDZ8O$^tgkB(WClfBK+lrm7)B@Vy*%T zqIr7634TL`+wU;Z85L#W231hmeuY!`ky84b`6N;KCSocgqb#j2d@`v}j~ImW`~GT3 zD1UcpA=p=L&^eBkp|VPprAGYw{8@VYJR_@w$d;Mrkm8_O{Hb&4OM~?AIt7e!^$Afq zJ||OV#ZKoaDSx%YnxZ$;7vKQsrY0e2v1K6ypRtlaA>LxY9{IAtNCqXC)v4MXM-pSE z0Hu?EL`W6ZU@M6H@ulup%kJOn80;9g!r4O2&7Sa*5IW{pRaAd8)pLlt7iI{dJqghy zOgADkgRI8jUl~i6)7|IQawiqSM2X2GvymY~p_K$}$_j6fLoBH5bBKw|ldVY=%uA&M zDqqZ5N|&+Cd6Z0-6HM8(?KVO_-7bHd&cw zaS!%22_UGqq)`cnIj5~33+dHeU*%J^#WDB3+jw;7@@S%$mYsOl*I2uvv3{`p5r=${ zK#xQv(b%&UpOllCd0iPjwY=ll+b^Yg__=@+To=--D_rUaHp`X` zu>50OrtN+y(VS5yY#o3jLLb5!VU?EH5-oUi@Rbp^x#fn?VeP04(F*4!RgN!675e2kq~39pYdL=$qR@~ zjA*_Wh&1HoWmd{8!>m?xxB7*}-tE*=Xc(5X%~F!v>4B>Av}jc`OhA9`j5m$^IEAuU zhAVC?K2x|aHTHUc!zR+bNN_usZs7sVggBg_7H$qF;t`g*<4)2St(WDpLKqi`KWKNx zZVIxk8$vd-8wX5v3c+h9blwjB?}rvkQv*VoWEDyyca<9J-Y(PujGDaz0~8>#dk(};yokZZVL0I4ver;@M4|)s7n&~-}_Y# ziKT=!6X5j~@>@kjQM$Z!l)Bw8?m0!DT1K}fjkc%UgCtM-b3KPOHK@mum0sX^ea_bFf6pI4JscAd#WQ@yqB9b8D}pF%u@D&JvM#9*c{^zPFnxonLuroPrAf z0G@jEOzH}7iyhfok=Zk`y}2voAJ?`qf*JC>(e;l}9?0x!!w-IXmT}1!Y=S1) zGR&2;)|lR+c)f!o5c7zLxmwnO z%NadPD{)&?k%ia0A1MMwD3a3(K6W&03c|D9flHnz%5)i26e-P%KG4vDT+j3{ZPB{B zQ_>cg1Gk%rHZEijZsOcP5;YxbmUPn62EnXNMn)hr;*cFSMoPEJYLtoJ#ZAjz1o5B`?IoSF)5&Kc)VX#tG(QP#d>C5iUm5kKv09GbKUL!?F|$M4 z(Ax1=?8_57*3DKQ;*{04X@*juH9!gh!ATu6BRHf6Y0~N1oO~n(q?QxS|K!k*go zC7KmEJL`jLo=?5EuoU`@?K5*{*Z#{C)%9q`$^b%^M!C!%1LQtO;|~oxzTYBI_o2ye zd|M3t#BU7A4&;t3sVvz;L&6Yw9B0=x6|^My-fknko}}nJ<2K%NLp-GTyw(%i4<*G?cFw$c7ARARy(4)(r|Bsa&G6kx zAnOb1YkgVd>mcy1%A3by3+w7#&zUWH>L(RI==P_K@gn3aeWR_}8d?Pmsm*U=Fy@S$ zeGVblD&L5W9bucBpor?;qzTV@N46`9Pv>tEG(YgJ8lFTHcn2&ae4z8ZxTj9=#|WV_>DCCR*r7LeWO7U zVRMSe0}E=igZUH-V%Rh=Dpn2cK893}7;5EH0kWS8Qm9o*E6iCKos9o@#DJHnoj=yw z)I;AvCyrubJ2Ii6-`W7MKX#s%rb5{ zwZgYOOf&}>E0uLIQ%$K`v1*a5z)_h)jHt>lBapi_6-VJU&ZPr0-P$U+5NXU^-<+}> z61MmN5E0@DdtP*Z;0_VOS9xgDa4hgw+W7l$D;i^wnS?ruJ^xXGhI_%c37h_a9UHcJ zq0cr|Z9K|kpnmonsUKG>Ql|_<3&uG!st<^A1#KubS7=}nz5HpQ$g&GEIf%`;CHUg) zohFMS8CKv)ZHg^L=&~iD#mzrJ>D7<5J2QR=H|Q-pQz4ZTzu`aK;Z;{{eyuFgBMu zg3O;71|6F!!{lcKjbB>&kwF_NX;%G;`8{t9yuV0`DoU`Zy$qv!7$@h??uo znQU3HCr;Z}1>`Gjs1w;qKa=;TuJX$KSpyGxfg zv>uW+5orMwRdc9v{$XV^5s{i<^|y+XFzyQsk3bQyNK{r-yl|`iZ;Hr}EN`oooLc01 zsUBuA65KOfPQjHGXX2a3$Alnz5{Q zfMbKzxx*c5;Kd0NS{?%P^F3hefsJ>;QSIqM`+NKzJNrLls?EN zVcK*2jLT0hVCiKhw!+)KaLn#|pJ_Z)_4H@D*I}Vd9Z$b0Ud&kfkRBiT!9Di+HC{l2 z=ZqnU9ym3I8dJ)Bpuzn(i}@L6<4TH)lJ>^<+F?!&pJZ9*($RpO^TmwiJm%LqAtb`d z=kT<3x1S--;HYRFN+=z$Eoh^Mamv*YpDjM^kt=Uz_3^Z5lBXb&yiGC^k%uEk;sQ#sjfaV@{I-*%8T+?+HVP#JgD9+l^hvpMO${mtE@}w+UXJgB zne}zm^4!aP476pp+7pe0iwi_00&kOE?)L@EX@#ckK`joNBSkE%1a(|}h^9pNf1X%`W$YbQmi5Ho{bvjO*RppA@fMnZK`a0 zTIuyS?}$JhLXEnGKRA;SK{jnQX>F#=-scrkfdenAF`j}3lnq3hPf}fse=p6>SbGjr z9n@g*Gl^n#Ei5^Nsr1IX%TIF5JsJ3!eJxSU@#=18OW(mO@p|Pf#t;*cVGjvg+O(+;i_}ro z_O>4emSbh}h{q|d=^wIuY2IXtg+F1|a{uakCDwos(3U`$rOFq}X?O=aMa7l=gjJi_ zbg*rv%c}};Cgse#lA$bp%}pxWaW;`cqx>8k>czAt^};9`TKPYcWh^_XT3(FJea-<3 zv*eG7n=>qXOpbC;Tcg=fZpN-}L{clI0wWO(eT4?tQ?D| zl1zh0B2wJ$Px%jD^gT^4Nl0aiC&~VaoxV+?ok`s&)3PNrV2$rrQv8OkZ4(7sPXvCDl1^8F%f zs2g7uqQKhNUd;L-^YS<_?x}h%Bjr?bO&qqY>l0P3Co}9^PVUi_ysMFrVzg;U79NPJ z-s#(fCr$-nwW%LzWeXGNl!nAh_{Gr@Go51i*FM=3QN>oE^Va9(RG764CQnqCvW?%r zP}E`F{5|wbyZ^9?;qBNg9lnHQx{qo4KhwcW{u6ZmH4u_TDhlz0aG9Hw)5n~o)MpI# zvPlF6+=Y%SoFbD_B@hDHGjpJaF8~CiBxpYW_Do-PoOx)Y%1Nx8eZxur->dmB$Tw0)6*Y8*CZ{NRz~{h}gH-O5B5 z@tExKa|_9AN&Y}N<1hv>E8?Ot!G`2*TJen(Ih%~tQBfUaPe#7*c*ply^;Q2{vyf7E z98+3LWu2L}-!3x~>!)elPkILeHZ>-8?kc z1$-v)_r;|(2b1^7BRlaE+w*~bVTJa^uBGA)Yld9U{A##k-|GazNbA9Tci+!dT#E$j z&?gS%Y}FtSDuxe?;2A-PxbhW7_MT(zcHK_EJn4r)jwK7-KCbPWQ1)2OUlLz)W_tfv zo6}hFF)EP|=^CAD+K>=)c?jPfy%5*5dPTx7hY{U2vjOa+&{KE9?_fPk@A4CA(5)u8}|6LgPgzacQi&lB`r8V>lFut)Ri?F$buI>YK#9V+hobxG zVdOu6TC4Q<16Yt{pFse=lve8Dj{CQ{wtoQA4zI4+GEg#{R<)X>JDP_cPh~Wr#RncT zX)nxoL|lxtiEsf~7WuLi5kITZzU#gu6u4R39;x!_0DG)yE1jN2|AUF_KHIe6B9pVp zy4hZFS(^fh`zI|*CnrTTE4<5ZlnONBAmI3BwLu1Q6#mWTIro_z6is zH0~%N1kOsF(M#J1O_@hL(Zz%pE12W%LojkR=rP8Zj*hpk?oPQyvQ8g`Gy>%L3+j|9 z9Z*M_hD2&vgRT^R1|kPxc)-6h%2zz1e1dyryG9eD2c}h^jHnq@1v0dKFNml~e6f!a zkbiysIkIVl(U5^Qc%~T$g``RVbUp{ZJA3MiMmLKWJ0~>Bo>}Ff*Uu_JGnNgb{(C$v zUML;;sVExcNETs$fQmL8?8ha_cE>u9eRsJng1Rp|1wogr{{ zZLrC=G|jv0nes6L44o_ut5c04Z8(|yYna+5me?m4^cI7$*#JfiuD|ZRNBz8-Km7zj z6{San&tiPyE$92@N-c{zi!5?I`cQ<5r9mRTd5;020Ip*2c{ts(qOk) z&Gln7$qfwT2q{Qa7N#bL){)Y|-i);ek=U~CwEk}YIoIUTPq=-9e~6LTja+XM?X&FT z)|Ae&jGj99OlJ5CPuak9+r~L^??)Ez9(WdgFGL{UZ+bSw=ThIAkb+=BV*5ZLZvx2R z!2H&EoAbsuoM!vj`6p^${8h+G(g(BloY}Hq%t;`6c_r!DmdYGP8FSOyAZU36*Yqb+x2qAVT5 zx-fs_-zBr1K}Ef}(}neQGjkX-328K;(h$CFD8Y`Uf5H219%9_+ZptIjK%C`3D&NT6u*|7f{v5Os+}x3D3}9Qv0+7GWLY<1Kg5+&(JGF=ek$ylBHrxH9dDUnkwwhLe1-S>;`LYTDs z^|>mE94h=MdY2>ID=mkrxld4PZt4Lq7hSrE)xq67*dUWy@DNoE(&5NElk39V{8X)u zWN+{$Hf(LXQr^>BZKR7Hu=3@V^zF3^t7CZ1z9=`n%6iaDs->kPCE#ZUbFIFCX>7JT zi;&x$9cZfAS8tiX+J8hc*LUO8HrrT(Vmss!)qH~nWK8&a)=f>qNYY1+Pyr)`v3bUn zS23&KNXuSTf$$)Hb##XE;(vxG8A=kAfiQKPBFT2U3l!WK%%FS!rL8$p)e!9^TtS=B zNYJRV$PuQpLg&IvRD>;?0eu=g(cj7Wvqc_C|MCH~@ekXIi|6sGQ*6i)F~fD$QexTzEDA z%8W(r`hyh0Y2a$#dITC1o+WQV3p;&e9{Hg8DXk68f~S?vUPBgEjs}{WE_OP+c)4Mu zYblCo5OSCIQLxZ#$>v&uQWVYQ&ILMTc_umUQbu+SU=Ceq3s|LM4DK%inBfia>6AW(vhg`rNz9 z!k8~UU}2Ej6^2cBX4a&wlGlXvTvCXZwBWvY$?p9nP5XmGVXTQj^pF2$D3qHELHaQ| zSrSb<@sr3Th4hIw?o%fI^U1acQyvx$ZR>@WjTo?bi3Ri#_G%a`^}zo%{hXYM zIclf41{Roeet(X$k#ct^ueiHM=01$ zn?jl@YqZ^vBJ5Gi{ka-H?mas?YKHAph1c~!je8;G)?iCm`RS;y;zlfRR*TC<{o?`N zYo~CA2ub)-L_WC2y$J~spYUEp z>~suY2S7>;uJj1t`47-3TP-HF7Nwyb%v2tZj(t~CC`~FiXec$5 zddY|t5nWXn%Ny|Z*Q7X>1#%q^lx=z{RyWE6%$Rh9yB0Wu6RR6O$n`9sx+5Z^BB;j9 z)mnnYOObUv{(Y%3A+LM#4N$Ox%? z#iN3Vn8CE?vO<%12C$pj<|KW|BkM?b8BHAY2q0Y$5xU zA_ae)E`H&;7?y&UOoNJiz0#b`dT$afA|H(sMP&D<@SOTmYRk@HrVkAgm0It!_xDnP z^cPTf`=x5u(WMa;IMJXN2iH`I(`sk@48=(>juC=zew(-5QKKKxg#aT_Ls_BgiUQBV zxs(asQZWAYQzIPe1(WA75UZZduh6}dusiSF2J$u#bbv(`V}kK^JeVO zZMiR5gz7`jD&eU^TG~)6UeI!E)%I>U`Hg9EJ9knz`>$%sXD@?p3aTsiFoObfsCvB^ z1rvHj4W1HBXVZ)!yHkb4#MI6VWKP>Bvl&TWpXUEbtt%4Cif0zIE`K z-8^2|7C;w?HYAr5hTlwTIepc@*VO)BQCA)hRTuYXV;DQbFpV{3j9r8$%Zw};+h9-= z5-lSUk*L(ni0mZ9Fib;s%F|ejWGzL5Axp{{E$wLM)3(Z%eTE_X(9a~I=`AxB%k$Osp9-pGd4&-9{g zVcwhdnVhD$wGsIpzeXiPtHe4+Agjt_2~sbEud3~uB1k<9cBS8a#wY}D|MFy!#hdeH zgaUpIWt5KC>~Zi&;uks-?u5F_sWBYe${NgVt^?_}NPV(h6wRarQ$Bx~$2+9J7cw!M zq72V(qEQoM3S)3#HDXFRzM^W8@u-q9&V3YcZKTcRaBA#@aF<|R%DXFi{u-;2s3x3n zd2~Vfo9@j<{f@rehhiOOF6Iz7*}pvI(}ibYaKqCmB^(&e!&eGEjX2eiEBzT`jae>M-?y3txxapz3+Xci(*(=BS6{bmynhwu2bckL_e! z0U;0t1nK}%sFXhKMaUohD>}j9s7zDdo5hA1N%3K8etlp;7XD@0Md<=#N@sP<6zjIX zJYPCA4C9KRS_3GzxI`rH91JdMkEULoNt9t39Zs;Au_Vm=5VHy{K6ymo=g3kH`M}@w zwX6R{@2-}-`YkPiML;vmu`;(g^jpo1lS?1J7l3N6s?uX=U6kDX9S=`_=B1J?i2L#sZZ?q&j!^= z-|aj1?Tss2dfUC7^X_c^npI#X5(b$sTTjS8?R8$y$D}mU{%8C5&!K?Mp0!e2Qk_;vF*>X@>01UgZ&=8o`Y8)n9WSRcc`)2%O@CPJ0`s|0r^SX!op#3 zm=c-ad*b4Bc++Q;8un9wy)&3P!JXUH9R1A9f1y&x>$zU*m7>d~OEo6m;=n?M_413| zFkL7LKqecPI$fL9X`=XSEa`;ir>s(Vixz!qc2q$nsn6w4{0v4gzdC28nxzYxX!iOf zj~RxembLG~u`69+-ds@lJWKy*{fD&X2-;e1Cc1M*SOZwbj%ILtLnC&DEF^ZkdEZj; znxs2An3r;FE%*Ms#Y-0Vd&zbG!i%?VbL!xe&t+?p&SpNHpS{){W9*71-1wO=klGx% z)}Y!Jlux%r74rkqVfSKB^<nA$^W&doUka#a{v00<1XySCq|8_4kb zxKiVHhF3KnPLwLaAt604zY^T|@m`7+-zBjsP%`EIJzead2wP>(h_TdkGu>0^@{D%x zgx=B7KKEGe#wDb_eTb;nkX8w8w@;XQRm()-pxLWq3XU0~0-#nN()~nvnq(P`2uVIb zjcYvz%7SEY7Jt1YX&YcH(4DUo0L;^&NVqTl5Rwhc(P0V!mm zi5(#ElDeId)(w&4*B724)>xpfN8rtDm~vn0#k8ZHa#rZv9QH> zB7KB#2Xi(^h)*%(H>pzClKLW)xCbZaS-i3Y!s38zm*a`>0a`sYp|Y2&A9^x(cJT-X zIY--lbX>bwdO^k&D14(vDnb?W3~~sW{!!kJKZSu zT|UdzjbRIOma1K??7%lNoy62J#zI=cKU39Zkk_L6#SOoJaUphjA3vcn$=w0x&^>B> z5}y|UkQm|RENF>xzLFL7GF4Gy*$N<~$tr@&|55?^v7GM%cV3pKZ-s!bNy_TQy&P-N zD&MgF&={!?Nez31;F~9EiO0CMbB|MX-$6diAu!LI4@Ok_mNB|c> zmGFh0&=l>)ltfwZ6?9&ZlN%I@_*{8J}9KNHrloYYK=Tni@(%Mbg2$uDlQ+yD^PdT2muo%NMN2W$`5WsTno(lQCu zJaD9{Noq-ro9g&#$I(YvfCRot$@WM!2@^Y`+o1MfdaO<@yF(`+SN}?AOjs2BW2Qun z$5$u!w&txH%6qMFY6h?4dklu~vO1Un{vI|sMRr$}7p~7DLZl>WvD(KNqa~)hv7+%* zU|`-_^f+A~dsQPH(`J0aZmu~;J#T5X==lCah%J$!` zkTG~cLf1l;I^z!1=>7B^Q;@s%KE&mbRh^Q2v3dOy$s>Eh0>M~hc6VX*Emynry+?aw zA06%q|-ZDYa@EQ&fSjyuR{*?bb{C8pRW_#f&8;pFbKB z<|dT{)S*Qq#4P(QpJ- zr_u?Lv0%irFuNv!m$>A6 z>LFp_(ekIF$#yWd*@B>$rN9WwDd>!v{S8-7Dbpuj^vDH#KB$NZ_C^SBihrxINrXuL z7wTqb_`Rr*xQBz@Wcy$ZFD>mZlhy~AFAwu3i6^_sD?KFOe`6foJSDd)6lb3{5l7R^ z3haN-y^}NirS^_xEf$qOOk3@wb)lhYAgs*jAPtbVp+EtFgMXYVR3C+hlrE*u@GigB z{Hfq<8kM?Y;9mcXOcdf}o=M2M>(I-XZkl=rve>XKiUbj%s=t{51RKSoWKF?KL-0^R zx-HOOQvFd0MMgr(S(^ZuI0@xkP(|q*EzoX+N0cR_1T7Y7)lDMkAekbC<6f6`H@9BN zhz#Q%B`AzfMSlqjCI%!q+6+Bh)IQZhsHIyl?Ql^<``_8@tOCah<8BR$xp@wqS!w6M46 zKNV?O*6NJes$!ua)A?kbGoIeLW{S5C^+`s%57-{9oK4=pwQj$QDH7GvA;U=B*PnAZ z%Qte-_|7fM)8NEFA@{rhyi#j{fW}ujqaELR&Fa_i3LV$sD#r-(Rd0iubK}8w&{rNd z0jdQICVjS60cK7`JZF@|(Ez;n6x?F-m$(XBQxbeaDRZd1-qW-L{ zFlR_8HWEQ3DRr?Rft|E>fG&c_awlz}f?a(jYT{Ylrg2+d+*fkDRCcG7U`~z$1@UN! zJr-yEQm+5PF8jtRomeq&IRXmd3MaJipi{Mw&2J?5t6mx#F>8wsUzeElXXOTS|GL3{|f|HEzS7K7> z>AAhkMCH-Yp($9%U&p`7cz8=SRehCJ_Yp*{8P^0z?f3_AyZ24|`5=o{gFrSxF;fZ3 zLWJ8mYRz~DS;!PYk5ctyXCKGY066iorg%0X2Li@(-E1&aW%Sm~rQiA{K!jfS+i!a7 zBvmfiU?-dKm4tMgo}|XXjNtcq8r)z!R{&YqJS1`t_(zZ@42Bco;z)QD60$(BugKH^ znYDYBvx}?lekuA}{@wNp?)D4CM_5!0o&b*FfwyJS1Z%Ul^wjq9oLVC3tP*h&95(3^+~;N^=zg9klu{URiSMEB2PdpqtrG5rWl&Tp=O=ZuCLnH22RTzPU+!Vq>K&6X>y=WGQT1JlIx)=O%&=?x)Ek zppSvQgq_mBAMrp!g+D9J8&mj;ZuX5dj*MTVNCi>|Nb~CwiJ*#6A#o3Ju=h)B@+{uX z7TlY704S?jt-?25m%jc&2!jv4J>`Bg6_Ync4)qOUdmM!DBITevX~nNMO`~wJo|W@j zp5$;O9xG}}+RH_7gdz1cK zY-bC$kbv>>kqz*V0hUIe-?FMjYqG$$4)W605L}%t1_qF)dewhHKV%EDAPaW|j~&(& zyQ8`G7|qi5UzN=aU7ZtytYWB0r5Mr$xudpemGYs%DGwc!j4S6fUOE|9p_bVeTzDhR z7b|{>#<}%a+{k*}lmy7ogP1C~N8fo0C+o7s;UmuaZ!DU5B8hCLt#!8FC6Y!gWPTc- z((O-0p+UvYU|U5#;VmBbv`9E0^q|G^s*_O4x$?rhZG*!s{)+d>fK# zr>178+1&{@TQ3ugsaI}%>#VPmtKHNzf^R>2tof}oQaG?{eb-W%%6j0h-trKAr9Y+m z8Z6~ilMyG8#hxE&8zZ2T8Jp+>OEl>|;EJbo_TaDHZ7NvXajoG%5N$nh%x)Vv1OSD< z4?jLBZomsrZ5_1l(Mcta)_n@$=XS4wxmRy#?_w_bk0z!=(`tJkE9 zJ$6>fxSb>}Z(3*cboZ9!?F{<0!OuHquDX^LDCLpAGk#_Mw1^)0r?s`OYuE0ij9t5_ z!N_<*f>F0#!Jn1_H3F63W9qNYY>a>xfrbK_(2G5rlWp9NnEI97m*r@Nf4&7M{Qr*# zN;V(AF%@dQlxRNQA3e3iHXm>Q5%%5*ULf@^D7^h9Z~|B_G6GEeuie{u!;d~l?AN}g ze<_F#tB?N)ctT>oUi({T$W}e|ThTV?x$;{~eHnBx&C0Ev>Hpi{Wv@Jm{l?097HWB5 z?Q4M3!S8K1r@aXraJ%UbEUH}TWRm)fM*SMW?Uwr1Ax=ZS%2=L8uL(tDVsn) zX||vJZGo&;Ag^5U*4YWpLcKj#2E1c_4RAG3UB-{JE*5k`oAA*x5HAkPc~AIv;(q|` CR=;-u literal 0 HcmV?d00001 diff --git a/samples/bindless_res/rockTexture2.jpg b/samples/bindless_res/rockTexture2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24d5db9c77e5ecf8ac2d7f33f13d0307fa791b1d GIT binary patch literal 121912 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 N5@5RXX%KZf@juFM2IBw# literal 0 HcmV?d00001 diff --git a/samples/bindless_res/tree.hmd b/samples/bindless_res/tree.hmd new file mode 100644 index 0000000000000000000000000000000000000000..70e25a79b9c3cc11442275d0293c12ff6c745531 GIT binary patch literal 15999 zcmZ{L30Mu^8~=|xx-ztj3 zlcS^U?DZy&PPF~MqHPMb43ADrnVcMLlNdjarEwYfZ}6|xfBw4s|Nmv+uY^BI|0Vtx zUC#ZAk3Fuz9B}#d`d2JUT}CcDCYxSA3s1kFfEm{r8MEhtEMncI^7V(~_@Qo&7@%)2 zx@ex@I(Ux7=Id9u3~_I{da9;iqZh}|Id_^&tBMuJe?7z9wTQ*E6}P#H_PvFM@gvGI zgjl}o$XTLCvWe_?&QfmY*onxmd(JVRmXtqn?!c|mkL6FEJ4Xz3CgAMVp`1@}5}K&K z;h3EET+@KtvZg5$_*?OQcqdg0yBF`_)@`4R)o}lR`p3^2jTsJixd`Tzpti#fwj}Am zqD7a;rEh?%#wcORIBP6vZsam_?1}TfKElnFN)Q-3T6|r-NXYHi0AV40(LeDKSFN&< zoE^{(DjY(%E=jz2bx}0YJ!6C$Us|D3@*GY>Wd-r)J)q&+6z==R^W>|s6+WG0f?vFP zpvLGd&VOGpS#zq7;Bh=hP#l{sE*+i2m2~q2pG^)}d^(YOkH|CmuVE`#B6?O_em3g_;%Kvv&=s9V?-D`qM|1^K`^ykE!t%vuO>i^6co;8$>Zwhz>Q z?STen)=+d;;2tdB0T~@e3*$~7BNGlIsHh>-D|v2cgG-TU=sLPp}tylEejR z!XmF^>|7B6w$$#SQ<|nVi^aES8LM!-Mw+VxIO|u7b%H>+;b-Ab>}qt)e@uXVEFYcnl@mlX!mv>9Dnv2exzAo&7^Eu z!z*_nC)PocX90IW(-1GkbSLLd4Mf{oedMP;8WuZTv7IyWr%2b{H35u`J&t zDsHS5UM2$`Q8q;q77RTG`(eaQOU|xqCTy9~Koak+5mZ8_ktckTxP4y?1l$>nMd@ms zZiiE(di`t?k$+d1EDjNUcAh1UHg}-5+7W9k-pDj2oCKxt&!j>Ai}32TD|&OKWX$Mx z=%eV5Cbw40GH&lLS63((rg;}(`wbmQJu^ex9O2Cs_UVsSqZs60R&q)wIKim>M&w=w zp<0r>hCW(hl))D4m1Xrrhp+VPHi10harRIBb zjZrI6Bi$9xdzs_B{mn9qT6@&l^%{anz1rC2*tQEagvg|i*!antGjw>e(- zKl8sl_QZe%jqtzjZ}yQgZlCujc8{4N8AVW{;q-1E~Id&$ zmqBmv6s*{23@ASkA2(kB=O#s2`H=z0%bDTypaLk-9*Bwk-GP643!J@rVpjEQuo zHo#?F^2rN9hOIu;Fl6f}tcv^y3-j+l+=UZR+RzW3E+-LB-V7TGYvIrvH>_#e4(dTX zoH_9sraO(m^LM6`+XdfY-{V?Xsc(lBo5sQ_pCz1;nGWtr@JF@scVt)cK?rGj3Vu!o z$oF;U_<Ref<+&Uu)A?K3!S-3)HiCSplv7P^dV2bZFT;91A^ z`15TxJgW`Cj91lygU%V~G@?5$E?7ydAOD1~Jb!Gm&V?Df^zqz|XYf!x6Q;ge3P&7* zu>8* zG49q6SQX(y2H4++J4?o(!}&?@Ho*>={YyaUu^u;Lj{u$}BXD}?2a=Gr6vAh)cyg}| zu3D2#K182|^Crf4zg&y7@z%ojBYf~oQW6-YcEXI5RxWKpiSWTw3Gc1~wCkZG+V|TG zxxGGv=Ae!^-PsAtmz;&%3w@wqzY#j!eI{t#AB4rbeu57P!N66E3F9|WEL*-9LwA-6 zQ~I7F-FznC!dq)0XZlqrn)_6k8Wt{^vl-~LRtXn4_Z6>Jy#~c036P$D3(}y9{NjRT zC+FZstu(HG?lm%_{dnBVZ3TxACCpf^&Rv=3D7Jl`h5PquV%%Xy9DdLYd*=s(!^=HT zgKq_E?;5gt*H%32ut5mzd4W6&ibdbIE5OEe8C0Bo#leVIn^bE1* zWOwL2yf;+aoh9FzYKU6M0z6pmDVFx#RIW1L5F5VTfvk7CA!BzVSO3#OY|%);fo}ux zXuoo@rSB=Yz0?SXPAi6*C!@e+;&tLbYc7sk;)_-n50d#G8sX*{WBB%VF6159ME1;f zAs1a2W25^>u`-;2s7ghweOC>89?yWpyJJDOTMttCcnPZR2*qbf#)9IQpO6`907cDR zp{U7&I3*WycC!jFV`qqXur3B1T3^AoybGX}s{utySIH`O2hnwKI)1SkDkfaDAi`S} zT)5^oY|_0CfjxH;t0%eGYBvn0e;GvT$H#$YhZKxHCx?kY2E#ee)8wea6zulK7U#*u zi+zflxx&^1a70-L{eKLAVr(J5K7VWo@WjZ^8%fW=7-8XrWE>sKVuR8WuKE2{vhlhT zZj1EB@Kg_R#iO=xbFn^dpW7LK49W(RhW&!2OdnqqWFkrMC#s`gK=^|&G+r!^Mc+5U zj+A5MwESHdek~re6K%u*gEioNp(mcTF~FnMhalp6DmnZy4{uxsQknO zoA!SK)m1WJm}_Ng3={Fo=?JurRf9WLKfzu<7;nCK0yV{%;J@4u2EXlzN1f9!Yt<#F zn{W^8j{4zK!^e=}SPXV%p3t}a25cKYALSfmcyDej{2bX8x2$~%^6u5ZG`5r%JvQS~ zf=aNs=Y`T0KhHsN@&v5#`vPn3s?leC1F7s1hbq2pFb~Iyww4tX+>M%oL+`m`z3YC6iTDIv?ELUS z+w(y7&V$XJke6Qvq{SGY&va%X?Dc+$_6R zH4R%g_Yni?J)xhSHCDAV$3cB-!DLu0G^C#7-rSmo_t%G^$#oz4gVSV7P+c<>D|Y9}^vDz}Uj7EkJ2aQQ&5FbW z4?5%7#4cDUL}F_5Ac&h7id{O<*90B>&Nc%>KPOcb8{@CfzyAH&2^xlDvEcbe$gz0F zS@%l9y)!$Z=Q0K_soG+C$DPnkZZ!R}-_MT+ky<18wdYVo01L#>{L-Cazn6#huhprQjqO8-N>n-Yq5JtTbz^CMl_7GMsBkL)?FHe&Do2f(A1oqJ-r84lxzWcxuIgT z`bRJs(-!yM3_@lkFRLl_D0eA(fk{oe81P`5aJjEHT9Z^Um}qScV=7m}i?;_*^TJ{1x6B%w+L__io%Wd57>YONTH=&# zx#YH(hR@5IAkI}oJbBs@Q|&&3ijqC%`*yb2|kved&UmN;}|H6%K7~d16KHQ*beOAu-&w1TS_fgS~zO#QOP4 z7@_h3_9nO^6Y;R@+l|vOPj5Hs`PjhiHi*7wyP<)R42N7AgG`;ei>gB$+0*V2Ue#U= z=>-8|&eYdnm;M#}`b1*6Z3HSUj3xouBXNJSCJL?!VxXHT#?`k#dTwXbI8;oYWsJi` zmz(ifte&_Fhr(i?ffE0#`o5EF_4GoOmX~<2dX{M3bW}FuQnl<4|8vT`MwEqR$nCAi zOX-T@@EyvqS$(9$|IS@FL^^~k;+RPdSZ9?a+NPxlt)F+mAO2SyHo(X>`U9Wzixx}#fops0Dg5DoRfRERndT(y^56q@US0@x zwRK=3KSJVv8LiI3+!Px${O}z`3ju5l6ft_5o5cT2zU}6=Ond?s^AvdZyN@Aww<b ziT?$DJWe_ly5bMho4Alk7ncogBT&#}sjE(Kw=^|C;;5|7t&N zB}#1~V7AbRYvxT7Js0)m0^JJX5C4luTm)L*7lR7N^19=?;S2pQpqZkJfB2u%t$gAX z`I2kYmFG>L`-uLk2ZgX%IuidgSvnmu25sOH9x3y_A?6sj_zVQoXWSqD$Hc{!ImUS5 z9iKP&c3OK(`lyY`PqZceml3ZoDqXH46~$`&a~DTq)JIF)y46dnztvrvNpa3cQuv7F zr}9=@yA#vI*j>G)`a8WgOtfFsR{U$xgBTX(!E*JXQvD4a{FP*`YZ45#)%fb3Mq*Ec zJXrL}MXJBm`a6lqye{0n@0z?tlcRX7X*HN;nn?AxVq^$ObWGr`8td~<>#Rll-Cw~h zP33R>jna`7PpFW!=-BelhqM=K32^ca4grG{w5yKzXl;)k)HxY+tP z5D|A?u(SRwz>IPHz@%A(J!T=^-`t1(|Mdj8^d9^Vhmi6}nczG)l3!BURct$18`E2V z!t0_OuF&@i#C%>uCIxmPTXseAEq9&}3!7A-%q1FMH;G)~{w)v@rAPv6T3sr7jpe;3 z7>cFD7^@#Q!7lqL+>eRhX#X%8zsZT8L_ta9nvpAj1?br*GI|abN zxk{L*<3ciC?{iUkKAQKa>nh4U)yLMO@1eSVi!4O#8kkJIDj0RsBd${-`8lWWa}(8~ z#qOUULS2>%c<(p{%oHENLS2biJB;JAp6igkTU^Dgk6rNj*a_g<_zof_uM;jE7|DHZ zisJ7MRuLUuc;NQ01<>4euk2b2{fw)s;i9a!M|d+MmQS^RRQBy~N3pN=5Ny6Y6~a@L zG2>!oxq;41?nzw?AIje+eKz#NkPgbIs1(J8f5Fu6aKdR(vdCj=1VZY%lVeDW{n}nd~rwlIA^FO5$K;`M3y8c!2SFYd?GtU zJT12!9)E6xyVI*VpUF|kXIOKODxO1HmOmfnr-@NP>R2>Q59R%5z~S++STW_RV9IpG zYu)_#adxXnoYM=q@_Zzw4W0>hx)~U;?gD4~Y%bLJ1oDoHx}s{563$ar$4q`ath`M7 zATwWafj{cGK$~!0eM*0PsZ$O4_6*(|=>|TR2O;ASF3X6&>Y~sup5HX?PT8Z*9dYTL zAvpfYGw$W{URddy^+EEjR(`jSK*UnS;zZA{5*Y_X*Ls!UEN5} z7Y2~&HjK}7i4uFqCBV+2GjMF_YHmp5IMisdhyK&_q2S2~-cQ>HmmI$ik7hgqwtXfX z*Z0LLYgNLS@0LxR7Q#D+MTidj12_}S&oErikn_q2z^apakU08@OvNOe|9H+DCuQsb z5BLGCgNJ}oZw`xgY=+p@fns&LEBL7O3QSs3N}NswNc@FaCxVKygP1wN}iK`3U@KT5Qr23Aw)W51q z3If%wL1LL=B{r;O#6BfWL_F^(@t2x{d@eG>P}CfM9$(k%i*<@^#MAHeCH|6;bEAAR zcbS|#bOR?l+lfEa6vchh8HvASe7#a$c_5dhtb2yUp7uv?k0)7HK~n#U88fWB_RJ)q zp;Uq2w{Rg*{;4kh(D0P_iLcDQ7p)V~U>`2be}x{<A8Kx+r|g+SvW72+O!krb~p`x`d6~DApE}ERh;?27E|im;GiB`gb>AG ziN8d>ABhIn@Ir zcEInJw>hgwUD5ZGm&9L+HoL%`1}iaimN%N$lnbkUEX0?|DDfA*hYRPrffWl^k3)-f z$4PjDp{RVr;V*xg9_&&xN+yijx(N%)x`Kz*YT|vJ?t|a_rMw^pbKk0n>-|^3{3qj3 zbG9?QeRfjfFI7QRu;*2gkhvrTOAE}AXg-9ZXT}nLv0(BcyfIju^;ria(}oI*BL;}$ zUv!iBiFR~T%oO4Dep~qfB9D7v<&u5>2s+)bK z{sHsth|8R=y~SY9}A+Mq?^p)QITnG_0}1D})Vkzo>lsXOI~ zPt{+-$1(S@P0T&6(cl2g+8i(KKLgeZ$Mt&$>E>s#;M!MV_?#5f`>{yce^F<~q2(hJ zoO<^T4!ymJw2m$Y8>2DO{wwMA0my^r@Gk!v&RTy-cxM)Z%S{-mf3;)bN7!0r2--D` z*x0KWJT^aoFF7Nm{a4jyHpCQ^fU4YM?7F;+%XsUHhhJz(`)@k!yJ%RILs-XKnE6%% z`C|iQ!`lp#_TQegt8B}x;7$^1J!Gx$Bs zY~PPe$qJSB-zuZW5LKZ}-i&R;n0b4k^o*YP^^}ve|1t*F%ZgWilf~Dm^X?~hLE9-y z;8wy|sectSt_!aIDvu|=?!#Iob?!~&WVFOwY5$q@E906x*McX$$GC2l+%|t7Y~P|I z?LRGxa4Z?+BrJGz7ujxdSYwqVG+P8q`%hz11zf(~2tTs~4Co(0BCRIk(egrR|7A@1 zz&*2l4d-(%Vh@EpPB$eS!{UqG>v_Cxb zy@HFkcgMXGj9_ahC+$C7oxM;s!$tgd(UQMS>+e`vf1UrSzZuHsA!%`U(O1Eg?@R0N zD_Vay{8N8-)Y5a3rODy}t?v8~T7NHVP9YEeslUxGwQ#xSDvA2soiC^Lw-2qqOaH0A z858D$>Nz=afOjvxC#}EwwEoWdr~YQFyAJ73CXmo38~))jSA1C!M}oce|JGmciS%=l zznE~rjIX2h*Ou1b)Bo0ApHl9;Tt{)uv>yB$T7T;t5zuEuR-@?N#d94NI?3}^;yLV0`AW2cY@O-#b ze@lc07&1>^bQz<|pQrUVnbzOdf9fw2UqXBAM};{nop}GBx~TglpTxMLRDbyon}v9r z2V`7q7k(hEzrM8oM*mZPcc}b;9hvJ%L?09W8m+%NV}fL}{;9v!K40P7xlh7lp$8vz za0K2^i6cI8jC6jK7}1tI8#rh}#U^|m4Ziq_u}T7Q%N zslRpSqQ$85`#G4u9Y0->7xj`X{vZA)|0qago;H-FrYytIC6;2)OB->~Kl{%iHct!- z)Ps}3>o8;g5wdfr9J%$+{yQwQ5DU${$w%CP`;KUe^iRct6{W+!$ev z%b82{yeRWE0e zklv~=<`h9$=cTYPECH?l*?$?OfkNJuQ!f4oU*qRK$H_Bt2TuL7|EgvNiAqLygliGg zuv3jpj6SC&HvhB#iVkleSHCYMw%R8#uSiV{+Fnj3{_0o`B;J*+AQy6SaYgDoqT@3}%=>5mEzG=58jqbNOFM1GGc87<-#k6h^Pl~v zVXIF*PDz5MCx!If^Ay*8=>%l{*?$$o!pPA>x5zNFQf%3mP9|q+i=F@3e+)moEWY?H zw^s28e%@mVC)X#_v#r1UPdCO+)aqOaU6L2!_{<$b_kamF{-6EFr%n>L+&M@NK7J1; z)z*;8o+rv4cS(`@_w$NJiRm`YWcs^GFq&OPtevbyj|E-vPyhbcci9fjE+<-+Pa){x zcY&RsFYFAQA@%R;CUp^Yo7;-HFF(PAnsCzoh>OYz^)Ar zl|!k2-))DRxJuWMs4V^t&*Bus;QfWLu+dBE-}j!XE>@e47Z#k<#uYPF#e0|Tf?7W( zsehmLK_nHoyFKg<898JK zpQg2eBjz{B>aH!J~k`em4~Z*5BpUFG`d88`Z*G*it!{SE$(1Mqha3O;jv_#=BpU?*=m$Tez*fBG95 z!5vAV@I=tl_TvW%{$iw69_4L``Y>rsJXKnCir#bJ-m*RnuRl9-=47&zprp9fCZJ8 z;pMb0ywScYGT1$~8`*bgb z(Wm=>yFskP?_&l&g6a`(xw`Bgy!xhE&^^3Ga5jpR_`g{j1CGnhxC-(N-DDit{WHM*tx(+@cH|Dk53hP9 z@7;O-9#^4{nxn{l=pga?i0CfpKCm1PEimD|LfTI{k58kUZSDC3K?cMfM0F8gM5yS6esy_k@{;)c%;a;y&$w6@#2df zOp&d9v5PGBOp^L*)%9{>o8TDI-eCYwe4I(JeGu(GeU=C}<#mHx9_7cvsOO-&o@J!$Sv(jQ2XWV&ia5mf5KOR%rNVM5A^S!vmw_;xWTsMDH6Z; z4sa5O-{Q%}P#1pYflGwBK16ggxGweAOm>VSKN@0)?5iiQsbEUH*6E28TihjnpOIQm zHhVk6!86Fuoo`5bHn`)GMm_0#aA8_A>H08}SbcWkv-=(ql)_WQXM2}Q{WYbtMWm_S z8WLNCylO@=S;!6*<6RXbeqR)sOZF{v1Z_EJ0Yjv2QEZ&AbC0>(Fg}SdT`+@W$-9e36||)DnTkUTxQy2krD2m&`7tMs zlQHMk$n59DOXo8gC(d%u4GM&*XD9KK`&W>SjrL;ndjsiwhM8s|Td(TJ_034;$G^xT z^Lx&-qNziw6Sp*{l2lJBiN;T1xs9sgn*5lcn<+6WLqt+K~y|?t&D4dt4H^ z5^sj~SNq|g^O=md{b8ueAnw)LRQ{reIeGl0JG$+XN#`?pJ)?T7x`-t3| z@9^h*#^1ydR#)!fzIUF)YXz&4$LIa=#GCf`=X^#(ZX~R?J1U6NC-W00-4k@~xrj}b zmeTo*hC(VdjGf3un5Xj79xf}t>~4YhkeAM90*7Y9Y)%1ldl}+W@4N7sZt~)pnh|JNiqiAN|4IowG3$A%V9x6RwbnkD36-Arqcc@+Y zMK(6rH*cX3b<|+WeZt*#2gJ@+DgwClhOMiQOguQ0>^7sdt<_4Te8ly zqx5`XK5lSHopl!28BY9Et3Kk`nO3+zXO#4OVLsdvJnt1iydUr<&$f`PlLOJuuuAIR z^LbMt!nZq0Q)0=rNrsv>APh&eWpM7*Jh_F{F|qosH;hOl`)$brot+ zW=!bowxd^7`kE$G@4|FtOzEq2Wx7#lQdx`6zpPr+qQ{ugwL8^>8wL_D{8T#vl3%R-(PzQJNoY0(|6W^;+NiwzR$nj^Qnsh zy|-ifP`^C2$p07DmvLeonSP85<4mQ#^hZ@PDsdDtssY2(V`84p&Q$A1ul?xkNJoDv z@ifbof~R(88pF{6%mC_fqgEGYAoT*xA4F&O-z$00bvee98O(SyUW^ap$M{ldFyl{$ zFEfO~pK3#y;mk0Kp;RACqkJg_(|9jt1eJ!keT;nJ^}T31>z#k<1t>g)vcdjA5cFqNp~OiDAZ3jHP-QjT%D{M&rYo z@l=YTS+Nu`)INsBMAI>rnLs^p)Edc5q~5VKKc3DBzgJ46>qaw4Ofr+gOkyT8QVwaiv3ZJ}A)D7H}hdK$Blj!n#V z>e)f98k3g!g8Rx+oUlN6OyCe$KOS!7OA zochmFN#iQ0_YC!%rB;zSN4=Fa=RBP+{La3}Tw<;;mzk@~HKvM6mze8xR53Rwu2bzM zbDOzEag*woXjB!&B^rO3xkIJfG^?88HnmsLm>YE5WbRVWJ!-wi+^61~H2(peAO2qH z5ncBN^O&h&o-$9EXUq%cIhAUdmvlU5UQxWHS}pU2c}-DE^%@%WoT7%tKVjZd=?%@Q zqj*E@&uPpnI%=7B)KgEbFPQh#TTAmB==|aLN+0REub4*W6Vt?eX1*{jOf!`}F|Bko zGhZoMsrHTe!F;FqM)glLs+r;wjsHx4I{Jm$TWH~Ep>s1G-)PoXdS%%!OdD!#VdPkb z{YLZU>8!y1-<1^ERvOioRbrLdcB~4k#;Q_DiB+dVm2FRrAnbh zv?w&GU6sbPr$d9)rXC$?Rbx9*uLjN6rE}-sE9ud7+q3$t0c*q>vc_x| z)`Ut1tSKEPY*z|Xs&!+{Su=`mR5zeeCKLuV-jMB1C3Bi(L19kqCN!oi9o^U-)YFq% zyReqj+l}U1(b@Xys!hEXY$W`$FPQu|066GTTa z8$mszsWp%tL%qQ?Ka$Q-zgLQ;>jtr7*>UW6HinI5~wY}JBwa3*g5QMiVP}Gra~9Bf z;qUB4Y!;itX0wagC2TI0ve-O2a@nO6c~o1*=CjKwmQg*6M&(ju(fDk31(ot?)=G+e mYR{!HOX*m~7EsSBYF)yvrru>Ve+`}2{$8n&uDg_7$NnD&B%c!i literal 0 HcmV?d00001 diff --git a/samples/bindless_res/treeTexture.png b/samples/bindless_res/treeTexture.png new file mode 100644 index 0000000000000000000000000000000000000000..2d689899a5f33f3e1ab00c52c5235f5250cc1241 GIT binary patch literal 30174 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 literal 0 HcmV?d00001 diff --git a/samples/bindless_res/treeTexture2.png b/samples/bindless_res/treeTexture2.png new file mode 100644 index 0000000000000000000000000000000000000000..dec034242eb6304718a2e68d2fc9d4441ff93a75 GIT binary patch literal 33486 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 Date: Mon, 5 Jan 2026 11:40:04 +0100 Subject: [PATCH 2/8] Merged globalsHandles and paramsHandle arrays. Lazy allocate handles array in MeshBatch and DX12Driver to avoid unnecessary array allocation. --- h3d/impl/DX12Driver.hx | 16 +++++++++++----- h3d/impl/RenderContext.hx | 6 +++--- h3d/scene/MeshBatch.hx | 7 +++++-- h3d/shader/Buffers.hx | 9 +++------ 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/h3d/impl/DX12Driver.hx b/h3d/impl/DX12Driver.hx index 44f291bb21..e30d80ccc1 100644 --- a/h3d/impl/DX12Driver.hx +++ b/h3d/impl/DX12Driver.hx @@ -452,7 +452,7 @@ class TextureData extends ResourceData { public var uploadBuffer : TextureUploadBuffer; var clearColorChanges : Int; public var cpuViewsIndex : Array = [for (i in 0...16) -1]; - public var handles : Map = []; + public var handles : Map; public function setClearColor( c : h3d.Vector4 ) { var color = color; @@ -2217,7 +2217,7 @@ class DX12Driver extends h3d.impl.Driver { else frame.commandList.setGraphicsRoot32BitConstants(regs.params, dataSize >> 2, data, 0); for ( i in 0...shader.paramsHandleCount ) { - var handle = buf.paramsHandles[i]; + var handle = buf.handles[i]; transition(handle.texture.t, shader.kind == Fragment ? PIXEL_SHADER_RESOURCE : NON_PIXEL_SHADER_RESOURCE); } } @@ -2244,8 +2244,10 @@ class DX12Driver extends h3d.impl.Driver { frame.commandList.setComputeRoot32BitConstants(regs.globals, dataSize >> 2, data, 0); else frame.commandList.setGraphicsRoot32BitConstants(regs.globals, dataSize >> 2, data, 0); - for ( i in 0...shader.globalsHandleCount ) { - var handle = buf.globalsHandles[i]; + var startIdx = shader.paramsHandleCount; + var lastIdx = startIdx + shader.globalsHandleCount; + for ( i in startIdx...lastIdx ) { + var handle = buf.handles[i]; transition(handle.texture.t, isFragment ? PIXEL_SHADER_RESOURCE : NON_PIXEL_SHADER_RESOURCE); } } @@ -2842,7 +2844,11 @@ class DX12Driver extends h3d.impl.Driver { } override function getTextureHandle( t : h3d.mat.Texture ) : h3d.mat.TextureHandle { - var handle = t.t.handles.get(t.bits); + var handle : h3d.mat.TextureHandle = null; + if ( t.t.handles == null ) + t.t.handles = [] + else + handle = t.t.handles.get(t.bits); if ( handle == null ) { var sampler = getCpuSampler(t); var srv = getCpuTexView(t); diff --git a/h3d/impl/RenderContext.hx b/h3d/impl/RenderContext.hx index 844f433ab9..f0d83c263e 100644 --- a/h3d/impl/RenderContext.hx +++ b/h3d/impl/RenderContext.hx @@ -218,13 +218,13 @@ class RenderContext { inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) { var g = s.globals; var ptr = getPtr(buf.globals); - var hid = 0; + var hid = s.paramsHandleCount; while( g != null ) { var v : Dynamic = globals.fastGet(g.gid); if( v == null ) throw "Missing global value " + g.path; if ( g.type.match(TTextureHandle) ) - buf.globalsHandles[hid++] = v; + buf.handles[hid++] = v; fillRec(v, g.type, ptr, g.pos); g = g.next; } @@ -278,7 +278,7 @@ class RenderContext { continue; case TTextureHandle: v = i.getParamValue(p.index); - buf.paramsHandles[hid++] = v; + buf.handles[hid++] = v; default: v = i.getParamValue(p.index); } diff --git a/h3d/scene/MeshBatch.hx b/h3d/scene/MeshBatch.hx index ff33f6f743..6dee661a5e 100644 --- a/h3d/scene/MeshBatch.hx +++ b/h3d/scene/MeshBatch.hx @@ -567,6 +567,8 @@ class MeshBatch extends MultiMaterial { var m : h3d.Matrix = curShader.getParamValue(p.index); bufLoader.loadMatrix(m); case TTextureHandle: + if ( batch.textureHandles == null ) + batch.textureHandles = []; var v : h3d.mat.TextureHandle = curShader.getParamValue(p.index); batch.textureHandles.push(v); bufLoader.loadInt(v.handle.low); @@ -621,7 +623,8 @@ class MeshBatch extends MultiMaterial { p = p.next; } ctx.uploadParams(); - ctx.selectTextureHandles(p.textureHandles); + if ( p.textureHandles != null ) + ctx.selectTextureHandles(p.textureHandles); var prev = ctx.drawPass.index; ctx.drawPass.index >>= 16; super.draw(ctx); @@ -720,7 +723,7 @@ class BatchData { public var indirectCallBuffers : Array; public var buffers : Array = []; public var bufferFormat : hxd.BufferFormat; - public var textureHandles : Array = []; + public var textureHandles : Array; public var data : hxd.FloatBuffer; public var params : hxsl.RuntimeShader.AllocParam; public var shader : hxsl.BatchShader; diff --git a/h3d/shader/Buffers.hx b/h3d/shader/Buffers.hx index 3cee66da0a..60101b9fc9 100644 --- a/h3d/shader/Buffers.hx +++ b/h3d/shader/Buffers.hx @@ -12,11 +12,10 @@ typedef ShaderBufferData = hxd.impl.TypedArray.Float32Array; class ShaderBuffers { public var globals : ShaderBufferData; - public var globalsHandles : haxe.ds.Vector; public var params : ShaderBufferData; - public var paramsHandles : haxe.ds.Vector; public var tex : haxe.ds.Vector; public var buffers : haxe.ds.Vector; + public var handles : haxe.ds.Vector; public function new() { globals = new ShaderBufferData(0); @@ -29,14 +28,12 @@ class ShaderBuffers { var np = s.paramsSize << 2; var nt = s.texturesCount; var nb = s.bufferCount; - var ngh = s.globalsHandleCount; - var nph = s.paramsHandleCount; + var nh = s.globalsHandleCount + s.paramsHandleCount; if( globals.length < ng ) globals = new ShaderBufferData(ng); if( params.length < np ) params = new ShaderBufferData(np); if( tex.length < nt ) tex = new haxe.ds.Vector(nt); if( nb > 0 && (buffers == null || buffers.length < nb) ) buffers = new haxe.ds.Vector(nb); - if( ngh > 0 && (globalsHandles == null || globalsHandles.length < ngh) ) globalsHandles = new haxe.ds.Vector(ngh); - if( nph > 0 && (paramsHandles == null || paramsHandles.length < nph) ) paramsHandles = new haxe.ds.Vector(nph); + if( nh > 0 && (handles == null || handles.length < nh) ) handles = new haxe.ds.Vector(nh); } } From 78c61c598c35e207d176e34d1a075ee831c70e64 Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Mon, 5 Jan 2026 14:29:43 +0100 Subject: [PATCH 3/8] Added texture handle getter --- h3d/mat/Texture.hx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/h3d/mat/Texture.hx b/h3d/mat/Texture.hx index 74a0d87916..dccfa9ba2f 100644 --- a/h3d/mat/Texture.hx +++ b/h3d/mat/Texture.hx @@ -372,6 +372,10 @@ class Texture { } } + public function getHandle() : h3d.mat.TextureHandle { + return mem.driver.getTextureHandle(this); + } + /** This will return the default depth buffer, which is automatically resized to the screen size. **/ From 9e56da93ed8813fef259e00c708dfedabfecdedb Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Mon, 5 Jan 2026 17:50:32 +0100 Subject: [PATCH 4/8] Added sampler tracking when assigning texture in HLSL. --- hxsl/HlslOut.hx | 59 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/hxsl/HlslOut.hx b/hxsl/HlslOut.hx index a99827ac99..362821c02f 100644 --- a/hxsl/HlslOut.hx +++ b/hxsl/HlslOut.hx @@ -100,10 +100,15 @@ class HlslOut { var decls : Array; var kind : FunctionKind; var allNames : Map; + var bindlessSamplersCount : Int; + var bindlessSamplers : Map; var samplers : Map>; var computeLayout = [1,1,1]; public var varNames : Map; + var isAssigningTexture : Bool = false; + var assignedTexture : TVar = null; + var varAccess : Map; var isVertex(get,never) : Bool; var isCompute(get,never) : Bool; @@ -256,6 +261,10 @@ class HlslOut { buf = tmp; add(name); add("()"); + if ( isAssigningTexture ) { + var v = switch( last.e ) { case TVar(v): v; default: throw "assert"; }; + assignedTexture = v; + } case TIf(econd, eif, eelse): add("( "); addValue(econd, tabs); @@ -425,8 +434,12 @@ class HlslOut { } } - function getSamplerName( v : TVar ) : String { - return "sampler_" + v.name; + function transferSampler( from : Int, to : Int ) { + var sampler = bindlessSamplers.get(from); + if ( sampler != null ) + bindlessSamplers.set(to, sampler); + else + samplers.set(to, samplers.get(from)); } function addExpr( e : TExpr, tabs : String ) { @@ -447,6 +460,8 @@ class HlslOut { var acc = varAccess.get(v.id); if( acc != null ) add(acc); ident(v); + if ( isAssigningTexture ) + assignedTexture = v; case TCall({ e : TGlobal(SetLayout) },_): // ignore case TCall({ e : TGlobal(g = (Texture | TextureLod)) }, args): @@ -467,7 +482,14 @@ class HlslOut { } switch( expr.e ) { case TVar(v) if (v.kind == Local ): - add(getSamplerName(v)); + var sampler = bindlessSamplers.get(v.id); + if( sampler != null ) + add('__BindlessSamplers[${sampler}]'); + else { + var samplers = samplers.get(v.id); + if( samplers == null ) throw "assert"; + add('__Samplers[${samplers[offset]}]'); + } case TVar(v): var samplers = samplers.get(v.id); if( samplers == null ) throw "assert"; @@ -521,8 +543,9 @@ class HlslOut { add(", "); addValue(tex, tabs); add(", "); - add(getSamplerName(v)); + add('__BindlessSamplers[$bindlessSamplersCount]'); add(")"); + bindlessSamplers.set(v.id, bindlessSamplersCount++); case TCall(e = { e : TGlobal(g) }, args): declGlobal(g, args); switch( [g,args] ) { @@ -631,6 +654,16 @@ class HlslOut { add(","); addValue(e2, tabs); add(")"); + case [OpAssign, TSampler(_), _]: + var v = switch( e1.e ) { case TVar(v) : v; default: throw "assert"; }; + var prevAssigningTexture = isAssigningTexture; + isAssigningTexture = true; + addValue(e1, tabs); + add(" = "); + addValue(e2, tabs); + transferSampler(assignedTexture.id, v.id); + isAssigningTexture = prevAssigningTexture; + assignedTexture = null; default: addValue(e1, tabs); add(" "); @@ -651,9 +684,16 @@ class HlslOut { case TVarDecl(v, init): locals.set(v.id, v); if( init != null ) { + var prevAssigningTexture = isAssigningTexture; + isAssigningTexture = v.type.match(TSampler(_)); ident(v); add(" = "); addValue(init, tabs); + if ( isAssigningTexture ) { + transferSampler(assignedTexture.id, v.id); + assignedTexture = null; + } + isAssigningTexture = prevAssigningTexture; } else { add("/*var*/"); } @@ -1047,12 +1087,12 @@ class HlslOut { add(STATIC); addVar(v); add(";\n"); - if ( v.type.isTexture() ) { - add(STATIC); - add('SamplerState ${getSamplerName(v)};\n'); - } } - add("\n"); + + if ( bindlessSamplersCount > 0 ) { + add(STATIC); + add('SamplerState __BindlessSamplers[$bindlessSamplersCount];\n'); + } for( e in exprValues ) { add(e); @@ -1062,6 +1102,7 @@ class HlslOut { public function run( s : ShaderData ) { locals = new Map(); + bindlessSamplers = new Map(); decls = []; buf = new StringBuf(); exprValues = []; From b732834c6cc29eceba5aeb53a14661508d01d307 Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Thu, 8 Jan 2026 12:33:02 +0100 Subject: [PATCH 5/8] Added NoVar qualifier in HXLSL. Added PerInstance support on texture with bindless. Added auto PerInstance texture on MeshBatch. --- h3d/impl/DirectXDriver.hx | 2 +- h3d/impl/Driver.hx | 4 ++ h3d/impl/GlDriver.hx | 15 ++++--- h3d/scene/MeshBatch.hx | 64 +++++++++++++++++++++++++++++ hxsl/Ast.hx | 1 + hxsl/Cache.hx | 72 +++++++++++++++++++------------- hxsl/Checker.hx | 1 + hxsl/Linker.hx | 46 ++++++++++++++------- hxsl/Printer.hx | 1 + hxsl/Serializer.hx | 2 +- hxsl/Splitter.hx | 4 +- samples/Bindless.hx | 86 ++++++++------------------------------- 12 files changed, 177 insertions(+), 121 deletions(-) diff --git a/h3d/impl/DirectXDriver.hx b/h3d/impl/DirectXDriver.hx index 9b8b2af762..511d012c0c 100644 --- a/h3d/impl/DirectXDriver.hx +++ b/h3d/impl/DirectXDriver.hx @@ -915,7 +915,7 @@ class DirectXDriver extends h3d.impl.Driver { override function hasFeature(f:Feature) { return switch(f) { - case Queries, BottomLeftCoords: + case Queries, BottomLeftCoords, Bindless: false; default: true; diff --git a/h3d/impl/Driver.hx b/h3d/impl/Driver.hx index 78c87124ee..cf91e3aa00 100644 --- a/h3d/impl/Driver.hx +++ b/h3d/impl/Driver.hx @@ -81,6 +81,10 @@ enum Feature { Supports instanced rendering */ InstancedRendering; + /* + Supports bindless + */ + Bindless; } enum QueryKind { diff --git a/h3d/impl/GlDriver.hx b/h3d/impl/GlDriver.hx index 45847e2585..7f904106d6 100644 --- a/h3d/impl/GlDriver.hx +++ b/h3d/impl/GlDriver.hx @@ -1958,11 +1958,16 @@ class GlDriver extends Driver { } override function hasFeature( f : Feature ) : Bool { - #if js - return features.get(f); - #else - return true; - #end + return switch(f) { + case Bindless: + false; + default: + #if js + features.get(f); + #else + true; + #end + }; } #if js diff --git a/h3d/scene/MeshBatch.hx b/h3d/scene/MeshBatch.hx index 6dee661a5e..9f3d73b673 100644 --- a/h3d/scene/MeshBatch.hx +++ b/h3d/scene/MeshBatch.hx @@ -8,6 +8,7 @@ enum MeshBatchFlag { EnableCpuLod; ForceGpuUpdate; EnableSubMesh; + EnablePerInstanceTexture; } typedef CpuIndirectCallBuffer = { bytes : haxe.io.Bytes, count : Int }; @@ -117,6 +118,13 @@ class MeshBatch extends MultiMaterial { meshBatchFlags.set(EnableStorageBuffer); } + /** + * Enable per instance texture if bindless is supported. + */ + public function enablePerInstanceTexture() { + meshBatchFlags.set(EnablePerInstanceTexture); + } + public function enableCpuLod() { var prim = getPrimitive(); var lodCount = prim.lodCount(); @@ -184,11 +192,59 @@ class MeshBatch extends MultiMaterial { } } + inline function initPerInstanceTexture() { + var shaderVisited : Map = []; + + if ( instancedParams == null ) + instancedParams = new hxsl.Cache.BatchInstanceParams([]); + inline function findInstancedParams(shaderName : String) { + var result = null; + for ( p in @:privateAccess instancedParams.forcedPerInstance ) { + if ( p.shader == shaderName ) { + result = p.params; + break; + } + } + + if ( result == null ) { + result = []; + @:privateAccess instancedParams.forcedPerInstance.push( { shader: shaderName, params : result } ); + } + + return result; + } + + for ( m in materials ) { + for ( p in m.getPasses() ) { + for ( s in p.getShaders() ) { + var ss = @:privateAccess s.shader; + var name = ss.data.name; + if ( shaderVisited.exists(name) ) + continue; + shaderVisited.set(name, true); + var params = null; + for ( v in ss.data.vars ) { + if ( v.kind != Param || !v.type.match(TSampler(_)) ) + continue; + if ( params == null ) + params = findInstancedParams(name); + if ( params.indexOf(v.name) < 0 ) + params.push(v.name); + } + } + } + } + } + function initShadersMapping() { var scene = getScene(); if( scene == null ) return; cleanPasses(); updateHasPrimitiveOffset(); + + if ( meshBatchFlags.has(EnablePerInstanceTexture) && @:privateAccess scene.ctx.engine.driver.hasFeature(Bindless) ) + initPerInstanceTexture(); + for( index in 0...materials.length ) { var mat = materials[index]; if( mat == null ) continue; @@ -573,6 +629,14 @@ class MeshBatch extends MultiMaterial { batch.textureHandles.push(v); bufLoader.loadInt(v.handle.low); bufLoader.loadInt(v.handle.high); + case TSampler(_): + if ( batch.textureHandles == null ) + batch.textureHandles = []; + var v : h3d.mat.Texture = curShader.getParamValue(p.index); + var h = v.getHandle(); + batch.textureHandles.push(h); + bufLoader.loadInt(h.handle.low); + bufLoader.loadInt(h.handle.high); default: throw "Unsupported batch type "+p.type; } diff --git a/hxsl/Ast.hx b/hxsl/Ast.hx index 6179729669..db56c8f602 100644 --- a/hxsl/Ast.hx +++ b/hxsl/Ast.hx @@ -104,6 +104,7 @@ enum VarQualifier { Sampler( name : String ); Final; Flat; + NoVar; } enum Prec { diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 09a8f6b44e..de886adf26 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -726,6 +726,7 @@ class Cache { case TVec(n,VFloat): n; case TFloat, TInt: 1; case TTextureHandle: 2; + case TSampler(_): 2; default: throw "Unsupported batch var type "+p.type; } var index; @@ -781,21 +782,19 @@ class Cache { return false; } - var p = rt.vertex.params; - while( p != null ) { - var v = getVar(p); - if( isPerInstance(p, v) ) - addParam(p); - p = p.next; - } - var p = rt.fragment.params; - while( p != null ) { - var v = getVar(p); - if( isPerInstance(p, v) ) - addParam(p); - p = p.next; + inline function addPerInstance(p : RuntimeShader.AllocParam) { + while( p != null ) { + var v = getVar(p); + if( isPerInstance(p, v) ) + addParam(p); + p = p.next; + } } + addPerInstance(rt.vertex.params); + addPerInstance(rt.fragment.params); + addPerInstance(rt.vertex.textures); + addPerInstance(rt.fragment.textures); var parentVars = new Map(); var swiz = [[X],[Y],[Z],[W]]; @@ -866,6 +865,18 @@ class Cache { default: [Z,W]; } floatBitsToUint({ p : pos, t : v.type, e : TSwiz(readOffset(ebuffer, index),swiz) }); + case TSampler(_): + var vh = new AllocParam(v.name + "Handle", v.pos, v.instance, v.index, TTextureHandle); + var vhreal = declareLocalVar(vh); + var swiz = switch( vh.pos & 3 ) { + case 0: [X,Y]; + case 1: [Y,Z]; + default: [Z,W]; + } + var extract = floatBitsToUint({ p : pos, t : vh.type, e : TSwiz(readOffset(ebuffer, index),swiz) }); + var einitHandle = { p : pos, e : TBinop(OpAssign, { e : TVar(vhreal), p : pos, t : vh.type }, extract), t : TVoid }; + var eresolveTex = { p : pos, e : TCall({e : TGlobal(ResolveSampler), t : TFun([]), p : pos }, [{ e : TVar(vhreal), t : vh.type, p : pos }, { e : TVar(vreal), t : v.type, p : pos }]), t : TVoid }; + return { p : pos, e : TBlock([einitHandle, eresolveTex]), t : TVoid }; case TFloat: { p : pos, t : v.type, e : TSwiz(readOffset(ebuffer, index),swiz[v.pos&3]) }; case TInt: @@ -912,21 +923,7 @@ class Cache { e : TBinop(OpAssignOp(OpMult),eoffset,{ e : TConst(CInt(stride)), t : TInt, p : pos }), }); - inits.push({ - p : pos, - e : TIf({ e : TVar(useStorage), t : TBool, p : pos },{ - p : pos, - e : TBlock(exprsStorage), - t : TVoid, - }, { - p : pos, - e : TBlock(exprsUniform), - t : TVoid, - }), - t : TVoid, - }); - - var fv : TVar = declVar("init",TFun([]), Function); + var fv : TVar = declVar("__init__vertex",TFun([]), Function); var f : TFunction = { kind : Init, ref : fv, @@ -934,7 +931,26 @@ class Cache { ret : TVoid, expr : { e : TBlock(inits), p : pos, t : TVoid }, }; + + var pinits = []; + for ( i in 0...exprsStorage.length) { + pinits.push({ + p : pos, + e : TIf({ e : TVar(useStorage), t : TBool, p : pos }, exprsStorage[i], exprsUniform[i]), + t : TVoid, + }); + } + + var fpv : TVar = declVar("__init__",TFun([]), Function); + var fp : TFunction = { + kind : Init, + ref : fpv, + args : [], + ret : TVoid, + expr : { e : TBlock(pinits), p : pos, t : TVoid }, + }; s.data.funs.push(f); + s.data.funs.push(fp); s.consts = new SharedShader.ShaderConst(vcount,2,countBits+1); s.consts.globalId = 0; s.consts.next = new SharedShader.ShaderConst(hasOffset,0,1); diff --git a/hxsl/Checker.hx b/hxsl/Checker.hx index e429c7bc20..0d7ddd5932 100644 --- a/hxsl/Checker.hx +++ b/hxsl/Checker.hx @@ -968,6 +968,7 @@ class Checker { } case Ignore, Doc(_): case Flat: if( tv.kind != Local ) error("flat only allowed on local", pos); + case NoVar: if( tv.kind != Local ) error("noVar only allowed on local", pos); } } if( tv.type != null ) diff --git a/hxsl/Linker.hx b/hxsl/Linker.hx index d210bc88b7..64e2a96349 100644 --- a/hxsl/Linker.hx +++ b/hxsl/Linker.hx @@ -255,6 +255,15 @@ class Linker { } if ( curShader != null ) curShader.hasSyntax = true; return { e : TSyntax(target, code, mappedArgs), t : e.t, p : e.p }; + case TCall({ e : TGlobal(ResolveSampler)}, [handle, { e : TVar(v)}]): + var handle = mapExprVar(handle); + var v = allocVar(v, handle.p); + if( curShader != null && !curShader.writeMap.exists(v.id) ) { + debug(curShader.name + " write " + v.path); + curShader.writeMap.set(v.id, v); + curShader.writeVars.push(v); + } + return { e : TCall({ e : TGlobal(ResolveSampler), t : TFun([]), p : e.p }, [handle, { e : TVar(v.v), t : v.v.type, p : e.p }] ), t : e.t, p : e.p }; default: } return e.map(mapExprVar); @@ -328,22 +337,25 @@ class Linker { buildDependency(s, r, s.writeMap.exists(r.id)); } - function collect( cur : ShaderInfos, out : Array, vertex : Bool ) { + function collect( cur : ShaderInfos, out : Array, vertex : Bool, prevHasVertex : Bool ) { if( cur.onStack ) error("Loop in shader dependencies ("+cur.name+")", null); if( cur.marked == vertex ) return; cur.marked = vertex; cur.onStack = true; - var deps = [for( d in cur.deps.keys() ) d]; - deps.sort(sortByPriorityDesc); - for( d in deps ) - collect(d, out, vertex); - if( cur.vertex == null ) { + + var isBatchInit = mode == Batch && StringTools.startsWith(cur.name,"batchShader_") && cur.name.indexOf("__init__vertex") < 0; + if( cur.vertex == null && !isBatchInit ) { debug("MARK " + cur.name+" " + (vertex?"vertex":"fragment")); cur.vertex = vertex; } - if( cur.vertex == vertex ) { + + var deps = [for( d in cur.deps.keys() ) d]; + deps.sort(sortByPriorityDesc); + for( d in deps ) + collect(d, out, vertex, cur.vertex == true || prevHasVertex); + if( cur.vertex == vertex || (isBatchInit && prevHasVertex == vertex) ) { debug("COLLECT " + cur.name + " " + (vertex?"vertex":"fragment")); out.push(cur); } @@ -376,12 +388,16 @@ class Linker { isBatchShader = mode == Batch && StringTools.startsWith(s.name,"batchShader_"); for( v in s.vars ) { var v2 = allocVar(v, null, s.name); - if( isBatchShader && v2.v.kind == Param && !StringTools.startsWith(v2.path,"Batch_") ) { - v2.v.kind = Local; - if ( v2.v.qualifiers == null ) - v2.v.qualifiers = []; - if(!v2.v.hasQualifier(Flat)){ - v2.v.qualifiers.push(Flat); + if( isBatchShader ) { + var isBatchParam = StringTools.startsWith(v2.path,"Batch_"); + if ( v2.v.kind == Param && !isBatchParam ) + v2.v.kind = Local; + if ( v2.v.kind == Local ) { + if ( v2.v.qualifiers == null ) + v2.v.qualifiers = []; + var qualifier = isBatchParam ? Flat : NoVar; + if ( !v2.v.hasQualifier(qualifier) ) + v2.v.qualifiers.push(qualifier); } } if( v.kind == Output ) outVars.push(v); @@ -503,8 +519,8 @@ class Linker { // collect needed dependencies var v = [], f = []; - collect(entry, v, true); - collect(entry, f, false); + collect(entry, v, true, false); + collect(entry, f, false, false); if( f.pop() != entry ) throw "assert"; // check that all dependencies are matched diff --git a/hxsl/Printer.hx b/hxsl/Printer.hx index 58f30f7b50..3c166dad45 100644 --- a/hxsl/Printer.hx +++ b/hxsl/Printer.hx @@ -66,6 +66,7 @@ class Printer { case Sampler(s): "sampler("+ s + ")"; case Final: "final"; case Flat: "flat"; + case NoVar: "noVar"; }) + " "); } if( v.kind != defKind ) diff --git a/hxsl/Serializer.hx b/hxsl/Serializer.hx index b7ddb37f23..9c8c988351 100644 --- a/hxsl/Serializer.hx +++ b/hxsl/Serializer.hx @@ -211,7 +211,7 @@ class Serializer { for( q in v.qualifiers ) { out.addByte(q.getIndex()); switch (q) { - case Private, Nullable, PerObject, Shared, Ignore, Final, Flat: + case Private, Nullable, PerObject, Shared, Ignore, Final, Flat, NoVar: case Const(max): out.addInt32(max == null ? 0 : max); case Name(n): writeString(n); case Precision(p): out.addByte(p.getIndex()); diff --git a/hxsl/Splitter.hx b/hxsl/Splitter.hx index f713d8884f..de1234ac6d 100644 --- a/hxsl/Splitter.hx +++ b/hxsl/Splitter.hx @@ -58,7 +58,7 @@ class Splitter { var v = inf.v; if( inf.local ) continue; switch( v.kind ) { - case Var, Local: + case Var, Local if ( !v.hasQualifier(NoVar) ): var fv = fvars.get(inf.origin.id); v.kind = fv != null && fv.read > 0 ? Var : Local; default: @@ -264,7 +264,7 @@ class Splitter { if( v.qualifiers != null ) { for ( q in v.qualifiers ) { switch (q) { - case Final, Flat: + case Final, Flat, NoVar: if ( nv.qualifiers == null ) nv.qualifiers = []; nv.qualifiers.push(q); diff --git a/samples/Bindless.hx b/samples/Bindless.hx index 475f24e549..03d86d38f9 100644 --- a/samples/Bindless.hx +++ b/samples/Bindless.hx @@ -1,96 +1,46 @@ -class ColorTexture extends hxsl.Shader { - static var SRC = { - - @input var input : { - var uv : Vec2; - } - - @perInstance @param var textureHandle : TextureHandle; - var pixelColor : Vec4; - var calculatedUV : Vec2; - - function __init__() { - calculatedUV = input.uv; - } - - function getTexture(): Sampler2D { - var texture : Sampler2D; - resolveSampler(textureHandle, texture); - return texture; - } - - function fragment() { - var texture = getTexture(); - pixelColor = texture.get(calculatedUV); - } - } -} - class Bindless extends SampleApp { var cache : h3d.prim.ModelCache; - var rockTexHandle1 : h3d.mat.TextureHandle; - var rockTexHandle2 : h3d.mat.TextureHandle; - var treeTexHandle1 : h3d.mat.TextureHandle; - var treeTexHandle2 : h3d.mat.TextureHandle; - - var rockShader = new ColorTexture(); - var treeShader = new ColorTexture(); - var rockInstancedShader = new ColorTexture(); - var treeInstancedShader = new ColorTexture(); - var rockBatch : h3d.scene.MeshBatch; var treeBatch : h3d.scene.MeshBatch; override function init() { cache = new h3d.prim.ModelCache(); - var sun = new h3d.scene.pbr.DirLight(new h3d.Vector( 0.3, -0.4, -0.9), s3d); + var sun = new h3d.scene.pbr.DirLight(new h3d.Vector(0.3, -0.4, -0.9), s3d); sun.shadows.mode = Dynamic; var rockTex1 = hxd.Res.rockTexture.toTexture(); - rockTexHandle1 = engine.driver.getTextureHandle(rockTex1); - var rockTex2 = hxd.Res.rockTexture2.toTexture(); - rockTexHandle2 = engine.driver.getTextureHandle(rockTex2); - var treeTex1 = hxd.Res.treeTexture.toTexture(); - treeTexHandle1 = engine.driver.getTextureHandle(treeTex1); - var treeTex2 = hxd.Res.treeTexture2.toTexture(); - treeTexHandle2 = engine.driver.getTextureHandle(treeTex2); - - rockShader.textureHandle = rockTexHandle1; - treeShader.textureHandle = treeTexHandle1; var rock : h3d.scene.Mesh = cast cache.loadModel(hxd.Res.rock); - for ( m in rock.getMaterials() ) - m.mainPass.addShader(rockShader); var tree : h3d.scene.Mesh = cast cache.loadModel(hxd.Res.tree); - for ( m in tree.getMaterials() ) - m.mainPass.addShader(treeShader); - tree.y = 3.0; - s3d.addChild(rock); - s3d.addChild(tree); + + var rockTex2 = hxd.Res.rockTexture2.toTexture(); + var treeTex2 = hxd.Res.treeTexture2.toTexture(); rockBatch = new h3d.scene.MeshBatch(cast rock.primitive,s3d); - rockBatch.material.mainPass.addShader(rockInstancedShader); + rockBatch.material.texture = rockTex1; rockBatch.enableStorageBuffer(); - rockBatch.begin(10); + rockBatch.enablePerInstanceTexture(); + rockBatch.begin(40); treeBatch = new h3d.scene.MeshBatch(cast tree.primitive,s3d); - treeBatch.material.mainPass.addShader(treeInstancedShader); + treeBatch.material.texture = treeTex1; treeBatch.enableStorageBuffer(); - treeBatch.begin(10); + treeBatch.enablePerInstanceTexture(); + treeBatch.begin(40); var rand = new hxd.Rand(2); - for ( i in 0...10 ) { - rockBatch.x = rand.rand() * 20 - 10; - rockBatch.y = rand.rand() * 20 - 10; + for ( i in 0...40 ) { + rockBatch.x = rand.rand() * 40 - 20; + rockBatch.y = rand.rand() * 40 - 20; rockBatch.setRotation(0, 0, rand.rand() * Math.PI * 2); - treeBatch.x = rand.rand() * 20 - 10; - treeBatch.y = rand.rand() * 20 - 10; + treeBatch.x = rand.rand() * 40 - 20; + treeBatch.y = rand.rand() * 40 - 20; treeBatch.setRotation(0, 0, rand.rand() * Math.PI * 2); - rockInstancedShader.textureHandle = (rand.rand() < 0.5) ? rockTexHandle1 : rockTexHandle2; - treeInstancedShader.textureHandle = (rand.rand() < 0.5) ? treeTexHandle1 : treeTexHandle2; + rockBatch.material.texture = (rand.rand() < 0.5) ? rockTex1 : rockTex2; + treeBatch.material.texture = (rand.rand() < 0.5) ? treeTex1 : treeTex2; rockBatch.emitInstance(); treeBatch.emitInstance(); } @@ -99,11 +49,9 @@ class Bindless extends SampleApp { } static function main() { - #if (hldx && dx12) h3d.mat.PbrMaterialSetup.set(); hxd.Res.initEmbed(); new Bindless(); - #end } } From 606fe9a84283b9dd9acbc1a6bb43ae6cfc68ee3b Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Fri, 9 Jan 2026 12:06:35 +0100 Subject: [PATCH 6/8] HXSL :Collect vertex and fragment dependencies separately --- hxsl/Linker.hx | 122 ++++++++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 52 deletions(-) diff --git a/hxsl/Linker.hx b/hxsl/Linker.hx index 64e2a96349..542c7a7a93 100644 --- a/hxsl/Linker.hx +++ b/hxsl/Linker.hx @@ -15,6 +15,12 @@ private class AllocatedVar { } } +private enum ShaderStage { + Undefined; + Vertex; + Fragment; +} + private class ShaderInfos { static var UID = 0; public var uid : Int; @@ -28,16 +34,19 @@ private class ShaderInfos { public var writeMap : Map; public var writeVars : Array; public var processed : Map; - public var vertex : Null; + public var stage : ShaderStage; public var onStack : Bool; public var hasDiscard : Bool; public var isCompute : Bool; + public var isBatchInit : Bool; public var hasSyntax : Bool; - public var marked : Null; - public function new(n, v) { + public var marked : haxe.EnumFlags; + public var added : haxe.EnumFlags; + + public function new(n, s) { this.name = n; this.uid = UID++; - this.vertex = v; + this.stage = s; processed = new Map(); usedFunctions = []; readMap = new Map(); @@ -194,9 +203,9 @@ class Linker { curShader.readVars.push(v); } // if we read a varying, force into fragment - if( curShader.vertex == null && v.v.kind == Var ) { + if( curShader.stage == Undefined && v.v.kind == Var ) { debug("Force " + curShader.name+" into fragment (use varying)"); - curShader.vertex = false; + curShader.stage = Fragment; } } return { e : TVar(v.v), t : v.v.type, p : e.p }; @@ -229,7 +238,7 @@ class Linker { } case TDiscard: if( curShader != null ) { - curShader.vertex = false; + curShader.stage = Fragment; curShader.hasDiscard = true; } case TVarDecl(v, _): @@ -284,11 +293,12 @@ class Linker { } } - function addShader( name : String, vertex : Null, e : TExpr, p : Int ) { + function addShader( name : String, vertex : ShaderStage, e : TExpr, p : Int, isBatchInit : Bool ) { var s = new ShaderInfos(name, vertex); curShader = s; s.priority = p; s.body = mapExprVar(e); + s.isBatchInit = isBatchInit; shaders.push(s); curShader = null; debug("Adding shader "+name+" with priority "+p); @@ -311,11 +321,11 @@ class Linker { continue; if( !parent.writeMap.exists(v.id) ) continue; - if( s.vertex ) { - if( parent.vertex == false ) + if( s.stage == Vertex ) { + if( parent.stage == Fragment ) continue; - if( parent.vertex == null ) - parent.vertex = true; + if( parent.stage == Undefined ) + parent.stage = Vertex; } debug(s.name + " => " + parent.name + " (" + v.path + ")"); s.deps.set(parent, true); @@ -337,27 +347,25 @@ class Linker { buildDependency(s, r, s.writeMap.exists(r.id)); } - function collect( cur : ShaderInfos, out : Array, vertex : Bool, prevHasVertex : Bool ) { + function collect( cur : ShaderInfos, vout : Array, fout : Array, stage : ShaderStage ) { if( cur.onStack ) error("Loop in shader dependencies ("+cur.name+")", null); - if( cur.marked == vertex ) + if( cur.marked.has(stage) ) return; - cur.marked = vertex; + cur.marked.set(stage); cur.onStack = true; - var isBatchInit = mode == Batch && StringTools.startsWith(cur.name,"batchShader_") && cur.name.indexOf("__init__vertex") < 0; - if( cur.vertex == null && !isBatchInit ) { - debug("MARK " + cur.name+" " + (vertex?"vertex":"fragment")); - cur.vertex = vertex; - } - var deps = [for( d in cur.deps.keys() ) d]; deps.sort(sortByPriorityDesc); for( d in deps ) - collect(d, out, vertex, cur.vertex == true || prevHasVertex); - if( cur.vertex == vertex || (isBatchInit && prevHasVertex == vertex) ) { - debug("COLLECT " + cur.name + " " + (vertex?"vertex":"fragment")); + collect(d, vout, fout, cur.stage == Vertex ? Vertex : stage); + if( cur.added.toInt() == 0 || (cur.isBatchInit && !cur.added.has(stage)) ) { + var addTo = cur.stage == Undefined || cur.isBatchInit ? stage : cur.stage; + cur.added.set(addTo); + var isVertex = addTo == Vertex; + var out = isVertex ? vout : fout; out.push(cur); + debug("COLLECT " + cur.name + " " + (isVertex?"vertex":"fragment")); } cur.onStack = false; } @@ -392,7 +400,7 @@ class Linker { var isBatchParam = StringTools.startsWith(v2.path,"Batch_"); if ( v2.v.kind == Param && !isBatchParam ) v2.v.kind = Local; - if ( v2.v.kind == Local ) { + if ( v.kind == Local ) { if ( v2.v.qualifiers == null ) v2.v.qualifiers = []; var qualifier = isBatchParam ? Flat : NoVar; @@ -422,6 +430,7 @@ class Linker { frag : -500, } for( s in shadersData ) { + isBatchShader = mode == Batch && StringTools.startsWith(s.name,"batchShader_"); for( f in s.funs ) { var v = allocVar(f.ref, f.expr.p); if( v.kind == null ) throw "assert"; @@ -430,26 +439,27 @@ class Linker { if( mode == Compute ) throw "Unexpected "+v.kind.getName().toLowerCase()+"() function in compute shader"; var offset = v.kind == Vertex ? shaderOffset.vert : shaderOffset.frag; - addShader(s.name + "." + (v.kind == Vertex ? "vertex" : "fragment"), v.kind == Vertex, f.expr, priority + offset); + addShader(s.name + "." + (v.kind == Vertex ? "vertex" : "fragment"), v.kind == Vertex ? Vertex : Fragment, f.expr, priority + offset, false); case Main: if( mode != Compute ) throw "Unexpected main() outside compute shader"; - addShader(s.name, true, f.expr, priority).isCompute = true; + addShader(s.name, Vertex, f.expr, priority, false).isCompute = true; case Init: var prio : Array; - var status : Null = switch( f.ref.name ) { - case "__init__vertex": prio = initPrio.vert; true; - case "__init__fragment": prio = initPrio.frag; false; - case "__init__main": prio = initPrio.main; false; - default: prio = initPrio.init; null; + var isBatchInit = false; + var status : ShaderStage = switch( f.ref.name ) { + case "__init__vertex": prio = initPrio.vert; Vertex; + case "__init__fragment": prio = initPrio.frag; Fragment; + case "__init__main": prio = initPrio.main; Fragment; + default: prio = initPrio.init; isBatchInit = isBatchShader; Undefined; } switch( f.expr.e ) { case TBlock(el): var index = 0; for( e in el ) - addShader(s.name+"."+f.ref.name+(index++),status,e, prio[0]++); + addShader(s.name+"."+f.ref.name+(index++),status,e, prio[0]++, isBatchInit); default: - addShader(s.name+"."+f.ref.name,status,f.expr, prio[0]++); + addShader(s.name+"."+f.ref.name,status,f.expr, prio[0]++, isBatchInit); } case Helper: throw "Unexpected helper function in linker "+v.v.name; @@ -469,22 +479,29 @@ class Linker { #end // build dependency tree - var entry = new ShaderInfos("", false); - entry.deps = new Map(); + var ventry = new ShaderInfos("", Vertex); + ventry.deps = new Map(); + if ( outVars.length > 0 ) + buildDependency(ventry, allocVar(outVars[0],null), false); + var fentry = new ShaderInfos("", Fragment); + fentry.deps = new Map(); for( v in outVars ) - buildDependency(entry, allocVar(v,null), false); + buildDependency(fentry, allocVar(v,null), false); // force shaders containing discard to be included for( s in shaders ) if( s.hasDiscard || s.isCompute || s.hasSyntax ) { initDependencies(s); - entry.deps.set(s, true); + if ( s.stage == Vertex ) + ventry.deps.set(s, true); + else + fentry.deps.set(s, true); } // force shaders reading only params into fragment shader // (pixelColor = color with no effect in BaseMesh) for( s in shaders ) { - if( s.vertex != null ) continue; + if( s.stage != Undefined ) continue; var onlyParams = true; for( r in s.readVars ) if( r.v.kind != Param ) { @@ -493,7 +510,7 @@ class Linker { } if( onlyParams ) { debug("Force " + s.name + " into fragment since it only reads params"); - s.vertex = false; + s.stage = Fragment; } } @@ -501,36 +518,37 @@ class Linker { if ( s.deps == null) continue; // propagate fragment flag - if( s.vertex == null ) + if( s.stage == Undefined ) for( d in s.deps.keys() ) - if( d.vertex == false ) { + if( d.stage == Fragment ) { debug(s.name + " marked as fragment because of " + d.name); - s.vertex = false; + s.stage = Fragment; break; } // propagate vertex flag - if( s.vertex ) + if( s.stage == Vertex ) for( d in s.deps.keys() ) - if( d.vertex == null ) { + if( d.stage == Undefined ) { debug(d.name + " marked as vertex because of " + s.name); - d.vertex = true; + d.stage = Vertex; } } // collect needed dependencies var v = [], f = []; - collect(entry, v, true, false); - collect(entry, f, false, false); - if( f.pop() != entry ) throw "assert"; + collect(ventry, v, f, Vertex); + if( v.pop() != ventry ) throw "assert"; + collect(fentry, v, f, Fragment); + if( f.pop() != fentry ) throw "assert // check that all dependencies are matched for( s in shaders ) - s.marked = null; + s.marked = haxe.EnumFlags.ofInt(0); for( s in v.concat(f) ) { for( d in s.deps.keys() ) - if( d.marked == null ) + if( d.marked.toInt() == 0 ) error(d.name + " needed by " + s.name + " is unreachable", null); - s.marked = true; + s.marked.set(Vertex); } // build resulting vars From bb0d7b7592b9ed41c398e67a47cf08bafd0c01b5 Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Fri, 9 Jan 2026 12:08:10 +0100 Subject: [PATCH 7/8] fix typo --- hxsl/Linker.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hxsl/Linker.hx b/hxsl/Linker.hx index 542c7a7a93..c8e47f77c6 100644 --- a/hxsl/Linker.hx +++ b/hxsl/Linker.hx @@ -539,7 +539,7 @@ class Linker { collect(ventry, v, f, Vertex); if( v.pop() != ventry ) throw "assert"; collect(fentry, v, f, Fragment); - if( f.pop() != fentry ) throw "assert + if( f.pop() != fentry ) throw "assert"; // check that all dependencies are matched for( s in shaders ) From 5e23d6b472f3b051dd6c034de063256a611cbe85 Mon Sep 17 00:00:00 2001 From: TothBenoit Date: Fri, 9 Jan 2026 14:43:51 +0100 Subject: [PATCH 8/8] Linker : Fixed init used by fragment and vertex --- h3d/shader/Base2d.hx | 5 ++++- hxsl/Linker.hx | 28 ++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/h3d/shader/Base2d.hx b/h3d/shader/Base2d.hx index 6eb5cbf3d2..22d0a1b414 100644 --- a/h3d/shader/Base2d.hx +++ b/h3d/shader/Base2d.hx @@ -42,6 +42,10 @@ class Base2d extends hxsl.Shader { var outputPosition : Vec4; + function __init__vertex() { + calculatedUV = hasUVPos ? input.uv * uvPos.zw + uvPos.xy : input.uv; + } + function __init__() { spritePosition = vec4(input.position, zValue, 1); if( isRelative ) { @@ -50,7 +54,6 @@ class Base2d extends hxsl.Shader { absolutePosition.zw = spritePosition.zw; } else absolutePosition = spritePosition; - calculatedUV = hasUVPos ? input.uv * uvPos.zw + uvPos.xy : input.uv; pixelColor = isRelative ? color * input.color : input.color; textureColor = texture.get(calculatedUV); pixelColor *= textureColor; diff --git a/hxsl/Linker.hx b/hxsl/Linker.hx index c8e47f77c6..971e19683f 100644 --- a/hxsl/Linker.hx +++ b/hxsl/Linker.hx @@ -293,8 +293,8 @@ class Linker { } } - function addShader( name : String, vertex : ShaderStage, e : TExpr, p : Int, isBatchInit : Bool ) { - var s = new ShaderInfos(name, vertex); + function addShader( name : String, stage : ShaderStage, e : TExpr, p : Int, isBatchInit : Bool ) { + var s = new ShaderInfos(name, stage); curShader = s; s.priority = p; s.body = mapExprVar(e); @@ -359,14 +359,30 @@ class Linker { deps.sort(sortByPriorityDesc); for( d in deps ) collect(d, vout, fout, cur.stage == Vertex ? Vertex : stage); - if( cur.added.toInt() == 0 || (cur.isBatchInit && !cur.added.has(stage)) ) { - var addTo = cur.stage == Undefined || cur.isBatchInit ? stage : cur.stage; - cur.added.set(addTo); - var isVertex = addTo == Vertex; + + inline function add(stage : ShaderStage) { + cur.added.set(stage); + var isVertex = stage == Vertex; var out = isVertex ? vout : fout; out.push(cur); debug("COLLECT " + cur.name + " " + (isVertex?"vertex":"fragment")); } + + if ( cur.isBatchInit ) { + // Batch init can be added multiple times, once per stage + if ( !cur.added.has(stage) ) + add(stage); + } else if ( cur.added.toInt() == 0 ) { + add(cur.stage == Undefined ? stage : cur.stage); + } else if ( !cur.added.has(Vertex) && stage == Vertex ) { + if ( cur.stage == Fragment ) + error("Shader " + cur.name + " cannot be added to vertex stage because it is marked as fragment", null); + // Init was first encountered as fragment dependency, but is also needed in vertex + debug("REMOVE " + cur.name + " from fragment"); + cur.added.unset(Fragment); + fout.remove(cur); + add(stage); + } cur.onStack = false; }