/// <summary> /// Sets the current texture sampler pool to be used. /// </summary> /// <param name="gpuVa">Start GPU virtual address of the pool</param> /// <param name="maximumId">Maximum ID of the pool (total count minus one)</param> /// <param name="samplerIndex">Type of the sampler pool indexing used for bound samplers</param> public void SetSamplerPool(ulong gpuVa, int maximumId, SamplerIndex samplerIndex) { _samplerPoolGpuVa = gpuVa; _samplerPoolMaximumId = maximumId; _samplerIndex = samplerIndex; _samplerPool = null; }
/// <summary> /// Ensures that the bindings are visible to the host GPU. /// Note: this actually performs the binding using the host graphics API. /// </summary> /// <param name="specState">Specialization state for the bound shader</param> /// <returns>True if all bound textures match the current shader specialiation state, false otherwise</returns> public bool CommitBindings(ShaderSpecializationState specState) { (TexturePool texturePool, SamplerPool samplerPool) = GetPools(); // Check if the texture pool has been modified since bindings were last committed. // If it wasn't, then it's possible to avoid looking up textures again when the handle remains the same. bool poolModified = _cachedTexturePool != texturePool || _cachedSamplerPool != samplerPool; _cachedTexturePool = texturePool; _cachedSamplerPool = samplerPool; if (texturePool != null) { int texturePoolSequence = texturePool.CheckModified(); if (_texturePoolSequence != texturePoolSequence) { poolModified = true; _texturePoolSequence = texturePoolSequence; } } if (samplerPool != null) { int samplerPoolSequence = samplerPool.CheckModified(); if (_samplerPoolSequence != samplerPoolSequence) { poolModified = true; _samplerPoolSequence = samplerPoolSequence; } } bool specStateMatches = true; if (_isCompute) { specStateMatches &= CommitTextureBindings(texturePool, samplerPool, ShaderStage.Compute, 0, poolModified, specState); specStateMatches &= CommitImageBindings(texturePool, ShaderStage.Compute, 0, poolModified, specState); } else { for (ShaderStage stage = ShaderStage.Vertex; stage <= ShaderStage.Fragment; stage++) { int stageIndex = (int)stage - 1; specStateMatches &= CommitTextureBindings(texturePool, samplerPool, stage, stageIndex, poolModified, specState); specStateMatches &= CommitImageBindings(texturePool, stage, stageIndex, poolModified, specState); } } CommitRenderScale(); return(specStateMatches); }
/// <summary> /// Sets the current texture sampler pool to be used. /// </summary> /// <param name="gpuVa">Start GPU virtual address of the pool</param> /// <param name="maximumId">Maximum ID of the pool (total count minus one)</param> /// <param name="samplerIndex">Type of the sampler pool indexing used for bound samplers</param> public void SetSamplerPool(ulong gpuVa, int maximumId, SamplerIndex samplerIndex) { ulong address = _context.MemoryManager.Translate(gpuVa); if (_samplerPool != null) { if (_samplerPool.Address == address && _samplerPool.MaximumId >= maximumId) { return; } _samplerPool.Dispose(); } _samplerPool = new SamplerPool(_context, address, maximumId); _samplerIndex = samplerIndex; }
/// <summary> /// Sets the current texture sampler pool to be used. /// </summary> /// <param name="gpuVa">Start GPU virtual address of the pool</param> /// <param name="maximumId">Maximum ID of the pool (total count minus one)</param> /// <param name="samplerIndex">Type of the sampler pool indexing used for bound samplers</param> public void SetSamplerPool(ulong gpuVa, int maximumId, SamplerIndex samplerIndex) { if (gpuVa != 0) { ulong address = _channel.MemoryManager.Translate(gpuVa); if (_samplerPool != null && _samplerPool.Address == address && _samplerPool.MaximumId >= maximumId) { return; } _samplerPool?.Dispose(); _samplerPool = new SamplerPool(_context, _channel.MemoryManager.Physical, address, maximumId); } else { _samplerPool?.Dispose(); _samplerPool = null; } _samplerIndex = samplerIndex; }