public PerObjectConstantBufferBinding(int slot, D3DConstantBuffer constantBuffer, bool isVertexBuffer, bool isGeometryShader, bool isPixelShader)
            {
                Slot           = slot;
                ConstantBuffer = constantBuffer;
                ShaderStageApplicabilityFlags applicability = 0;

                if (isVertexBuffer)
                {
                    applicability |= ShaderStageApplicabilityFlags.Vertex;
                }
                if (isGeometryShader)
                {
                    applicability |= ShaderStageApplicabilityFlags.Geometry;
                }
                if (isPixelShader)
                {
                    applicability |= ShaderStageApplicabilityFlags.Fragment;
                }

                _applicability = applicability;
            }
        public D3DShaderConstantBindings(
            RenderContext rc,
            Device device,
            ShaderSet shaderSet,
            MaterialInputs <MaterialGlobalInputElement> globalInputs,
            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs)
        {
            _device = device;

            ShaderReflection vsReflection = new ShaderReflection(((D3DVertexShader)shaderSet.VertexShader).Bytecode.Data);
            ShaderReflection psReflection = new ShaderReflection(((D3DFragmentShader)shaderSet.FragmentShader).Bytecode.Data);
            ShaderReflection gsReflection = null;

            if (shaderSet.GeometryShader != null)
            {
                gsReflection = new ShaderReflection(((D3DGeometryShader)shaderSet.GeometryShader).Bytecode.Data);
            }

            int numGlobalElements = globalInputs.Elements.Length;

            _constantBufferBindings =
                (numGlobalElements > 0)
                ? new GlobalConstantBufferBinding[numGlobalElements]
                : Array.Empty <GlobalConstantBufferBinding>();
            for (int i = 0; i < numGlobalElements; i++)
            {
                var genericElement = globalInputs.Elements[i];
                BufferProviderPair          pair;
                GlobalConstantBufferBinding cbb;
                bool isVsBuffer = DoesConstantBufferExist(vsReflection, i, genericElement.Name);
                bool isPsBuffer = DoesConstantBufferExist(psReflection, i, genericElement.Name);
                bool isGsBuffer = false;
                if (gsReflection != null)
                {
                    isGsBuffer = DoesConstantBufferExist(gsReflection, i, genericElement.Name);
                }

                if (genericElement.UseGlobalNamedBuffer)
                {
                    pair = rc.GetNamedGlobalBufferProviderPair(genericElement.GlobalProviderName);
                    cbb  = new GlobalConstantBufferBinding(i, pair, false, isVsBuffer, isGsBuffer, isPsBuffer);
                }
                else
                {
                    D3DConstantBuffer constantBuffer = new D3DConstantBuffer(device, genericElement.DataProvider.DataSizeInBytes);
                    pair = new BufferProviderPair(constantBuffer, genericElement.DataProvider);
                    cbb  = new GlobalConstantBufferBinding(i, pair, true, isVsBuffer, isGsBuffer, isPsBuffer);
                }

                _constantBufferBindings[i] = cbb;
            }

            int numPerObjectInputs = perObjectInputs.Elements.Length;

            _perObjectBufferBindings =
                (numPerObjectInputs > 0)
                ? new PerObjectConstantBufferBinding[numPerObjectInputs]
                : Array.Empty <PerObjectConstantBufferBinding>();
            for (int i = 0; i < numPerObjectInputs; i++)
            {
                var  genericElement = perObjectInputs.Elements[i];
                int  bufferSlot     = i + numGlobalElements;
                bool isVsBuffer     = DoesConstantBufferExist(vsReflection, bufferSlot, genericElement.Name);
                bool isPsBuffer     = DoesConstantBufferExist(psReflection, bufferSlot, genericElement.Name);
                bool isGsBuffer     = false;
                if (gsReflection != null)
                {
                    isGsBuffer = DoesConstantBufferExist(gsReflection, bufferSlot, genericElement.Name);
                }
                D3DConstantBuffer constantBuffer     = new D3DConstantBuffer(device, genericElement.BufferSizeInBytes);
                PerObjectConstantBufferBinding pocbb = new PerObjectConstantBufferBinding(bufferSlot, constantBuffer, isVsBuffer, isGsBuffer, isPsBuffer);
                _perObjectBufferBindings[i] = pocbb;
            }
        }