private void UpdateReflection(ShaderBytecode shaderBytecode, EffectReflection effectReflection, LoggerResult log) { var shaderReflectionRaw = new SharpDX.D3DCompiler.ShaderReflection(shaderBytecode); var shaderReflectionRawDesc = shaderReflectionRaw.Description; foreach (var constantBuffer in effectReflection.ConstantBuffers) { UpdateConstantBufferReflection(constantBuffer); } // Constant Buffers for (int i = 0; i < shaderReflectionRawDesc.ConstantBuffers; ++i) { var constantBufferRaw = shaderReflectionRaw.GetConstantBuffer(i); var constantBufferRawDesc = constantBufferRaw.Description; if (constantBufferRawDesc.Type == SharpDX.D3DCompiler.ConstantBufferType.ResourceBindInformation) { continue; } var linkBuffer = effectReflection.ConstantBuffers.First(buffer => buffer.Name == constantBufferRawDesc.Name); ValidateConstantBufferReflection(constantBufferRaw, ref constantBufferRawDesc, linkBuffer, log); } // BoundResources for (int i = 0; i < shaderReflectionRawDesc.BoundResources; ++i) { var boundResourceDesc = shaderReflectionRaw.GetResourceBindingDescription(i); string linkKeyName = null; string resourceGroup = null; string logicalGroup = null; foreach (var linkResource in effectReflection.ResourceBindings) { if (linkResource.RawName == boundResourceDesc.Name && linkResource.Stage == ShaderStage.None) { linkKeyName = linkResource.KeyInfo.KeyName; resourceGroup = linkResource.ResourceGroup; logicalGroup = linkResource.LogicalGroup; break; } } if (linkKeyName == null) { log.Error($"Resource [{boundResourceDesc.Name}] has no link"); } else { var binding = GetResourceBinding(boundResourceDesc, linkKeyName, log); binding.Stage = shaderBytecode.Stage; binding.ResourceGroup = resourceGroup; binding.LogicalGroup = logicalGroup; effectReflection.ResourceBindings.Add(binding); } } }
private void UpdateReflection(ShaderBytecode shaderBytecode, EffectReflection effectReflection, LoggerResult log) { var shaderReflectionRaw = new SharpDX.D3DCompiler.ShaderReflection(shaderBytecode); var shaderReflectionRawDesc = shaderReflectionRaw.Description; // Constant Buffers for (int i = 0; i < shaderReflectionRawDesc.ConstantBuffers; ++i) { var constantBufferRaw = shaderReflectionRaw.GetConstantBuffer(i); var constantBufferRawDesc = constantBufferRaw.Description; var linkBuffer = effectReflection.ConstantBuffers.FirstOrDefault(buffer => buffer.Name == constantBufferRawDesc.Name && buffer.Stage == ShaderStage.None); var constantBuffer = GetConstantBufferReflection(constantBufferRaw, ref constantBufferRawDesc, linkBuffer, log); constantBuffer.Stage = shaderBytecode.Stage; effectReflection.ConstantBuffers.Add(constantBuffer); } // BoundResources for (int i = 0; i < shaderReflectionRawDesc.BoundResources; ++i) { var boundResourceDesc = shaderReflectionRaw.GetResourceBindingDescription(i); string linkKeyName = null; foreach (var linkResource in effectReflection.ResourceBindings) { if (linkResource.Param.RawName == boundResourceDesc.Name && linkResource.Stage == ShaderStage.None) { linkKeyName = linkResource.Param.KeyName; break; } } if (linkKeyName == null) { log.Error("Resource [{0}] has no link", boundResourceDesc.Name); } else { var binding = GetResourceBinding(boundResourceDesc, linkKeyName, log); binding.Stage = shaderBytecode.Stage; effectReflection.ResourceBindings.Add(binding); } } }
private void UpdateReflection(ShaderBytecode shaderBytecode, EffectReflection effectReflection, LoggerResult log) { var shaderReflectionRaw = new SharpDX.D3DCompiler.ShaderReflection(shaderBytecode); var shaderReflectionRawDesc = shaderReflectionRaw.Description; // Constant Buffers for (int i = 0; i < shaderReflectionRawDesc.ConstantBuffers; ++i) { var constantBufferRaw = shaderReflectionRaw.GetConstantBuffer(i); var constantBufferRawDesc = constantBufferRaw.Description; var linkBuffer = effectReflection.ConstantBuffers.FirstOrDefault(buffer => buffer.Name == constantBufferRawDesc.Name && buffer.Stage == ShaderStage.None); var constantBuffer = GetConstantBufferReflection(constantBufferRaw, ref constantBufferRawDesc, linkBuffer, log); constantBuffer.Stage = shaderBytecode.Stage; effectReflection.ConstantBuffers.Add(constantBuffer); } // BoundResources for (int i = 0; i < shaderReflectionRawDesc.BoundResources; ++i) { var boundResourceDesc = shaderReflectionRaw.GetResourceBindingDescription(i); string linkKeyName = null; foreach (var linkResource in effectReflection.ResourceBindings) { if (linkResource.Param.RawName == boundResourceDesc.Name && linkResource.Stage == ShaderStage.None) { linkKeyName = linkResource.Param.KeyName; break; } } if (linkKeyName == null) { log.Error("Resource [{0}] has no link", boundResourceDesc.Name); } else { var binding = GetResourceBinding(boundResourceDesc, linkKeyName, log); binding.Stage = shaderBytecode.Stage; effectReflection.ResourceBindings.Add(binding); } } }