diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/CodeGen/Spirv')
4 files changed, 116 insertions, 244 deletions
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs index ed292ef1..0ef89b39 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs @@ -23,9 +23,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv public int InputVertices { get; } - public Dictionary<int, Instruction> UniformBuffers { get; } = new Dictionary<int, Instruction>(); - public Instruction SupportBuffer { get; set; } - public Instruction UniformBuffersArray { get; set; } + public Dictionary<int, Instruction> ConstantBuffers { get; } = new Dictionary<int, Instruction>(); public Instruction StorageBuffersArray { get; set; } public Instruction LocalMemory { get; set; } public Instruction SharedMemory { get; set; } @@ -217,7 +215,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { IrOperandType.Argument => GetArgument(type, operand), IrOperandType.Constant => GetConstant(type, operand), - IrOperandType.ConstantBuffer => GetConstantBuffer(type, operand), IrOperandType.LocalVariable => GetLocal(type, operand), IrOperandType.Undefined => GetUndefined(type), _ => throw new ArgumentException($"Invalid operand type \"{operand.Type}\".") @@ -274,31 +271,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv }; } - public Instruction GetConstantBuffer(AggregateType type, AstOperand operand) - { - var i1 = Constant(TypeS32(), 0); - var i2 = Constant(TypeS32(), operand.CbufOffset >> 2); - var i3 = Constant(TypeU32(), operand.CbufOffset & 3); - - Instruction elemPointer; - - if (UniformBuffersArray != null) - { - var ubVariable = UniformBuffersArray; - var i0 = Constant(TypeS32(), operand.CbufSlot); - - elemPointer = AccessChain(TypePointer(StorageClass.Uniform, TypeFP32()), ubVariable, i0, i1, i2, i3); - } - else - { - var ubVariable = UniformBuffers[operand.CbufSlot]; - - elemPointer = AccessChain(TypePointer(StorageClass.Uniform, TypeFP32()), ubVariable, i1, i2, i3); - } - - return BitcastIfNeeded(type, AggregateType.FP32, Load(TypeFP32(), elemPointer)); - } - public Instruction GetLocalPointer(AstOperand local) { return _locals[local]; diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs index 821da477..7c242589 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs @@ -98,8 +98,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv DeclareLocalMemory(context, localMemorySize); } - DeclareSupportBuffer(context); - DeclareUniformBuffers(context, context.Config.GetConstantBufferDescriptors()); + DeclareConstantBuffers(context, context.Config.Properties.ConstantBuffers.Values); DeclareStorageBuffers(context, context.Config.GetStorageBufferDescriptors()); DeclareSamplers(context, context.Config.GetTextureDescriptors()); DeclareImages(context, context.Config.GetImageDescriptors()); @@ -127,84 +126,63 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv return variable; } - private static void DeclareSupportBuffer(CodeGenContext context) + private static void DeclareConstantBuffers(CodeGenContext context, IEnumerable<BufferDefinition> buffers) { - if (!context.Config.Stage.SupportsRenderScale() && !(context.Config.LastInVertexPipeline && context.Config.GpuAccessor.QueryViewportTransformDisable())) - { - return; - } - - var isBgraArrayType = context.TypeArray(context.TypeU32(), context.Constant(context.TypeU32(), SupportBuffer.FragmentIsBgraCount)); - var viewportInverseVectorType = context.TypeVector(context.TypeFP32(), 4); - var renderScaleArrayType = context.TypeArray(context.TypeFP32(), context.Constant(context.TypeU32(), SupportBuffer.RenderScaleMaxCount)); - - context.Decorate(isBgraArrayType, Decoration.ArrayStride, (LiteralInteger)SupportBuffer.FieldSize); - context.Decorate(renderScaleArrayType, Decoration.ArrayStride, (LiteralInteger)SupportBuffer.FieldSize); - - var supportBufferStructType = context.TypeStruct(false, context.TypeU32(), isBgraArrayType, viewportInverseVectorType, context.TypeS32(), renderScaleArrayType); + HashSet<SpvInstruction> decoratedTypes = new HashSet<SpvInstruction>(); - context.MemberDecorate(supportBufferStructType, 0, Decoration.Offset, (LiteralInteger)SupportBuffer.FragmentAlphaTestOffset); - context.MemberDecorate(supportBufferStructType, 1, Decoration.Offset, (LiteralInteger)SupportBuffer.FragmentIsBgraOffset); - context.MemberDecorate(supportBufferStructType, 2, Decoration.Offset, (LiteralInteger)SupportBuffer.ViewportInverseOffset); - context.MemberDecorate(supportBufferStructType, 3, Decoration.Offset, (LiteralInteger)SupportBuffer.FragmentRenderScaleCountOffset); - context.MemberDecorate(supportBufferStructType, 4, Decoration.Offset, (LiteralInteger)SupportBuffer.GraphicsRenderScaleOffset); - context.Decorate(supportBufferStructType, Decoration.Block); + foreach (BufferDefinition buffer in buffers) + { + int alignment = buffer.Layout == BufferLayout.Std140 ? 16 : 4; + int alignmentMask = alignment - 1; + int offset = 0; - var supportBufferPointerType = context.TypePointer(StorageClass.Uniform, supportBufferStructType); - var supportBufferVariable = context.Variable(supportBufferPointerType, StorageClass.Uniform); + SpvInstruction[] structFieldTypes = new SpvInstruction[buffer.Type.Fields.Length]; + int[] structFieldOffsets = new int[buffer.Type.Fields.Length]; - context.Decorate(supportBufferVariable, Decoration.DescriptorSet, (LiteralInteger)0); - context.Decorate(supportBufferVariable, Decoration.Binding, (LiteralInteger)0); + for (int fieldIndex = 0; fieldIndex < buffer.Type.Fields.Length; fieldIndex++) + { + StructureField field = buffer.Type.Fields[fieldIndex]; + int fieldSize = (field.Type.GetSizeInBytes() + alignmentMask) & ~alignmentMask; - context.AddGlobalVariable(supportBufferVariable); + structFieldTypes[fieldIndex] = context.GetType(field.Type, field.ArrayLength); + structFieldOffsets[fieldIndex] = offset; - context.SupportBuffer = supportBufferVariable; - } + if (field.Type.HasFlag(AggregateType.Array)) + { + // We can't decorate the type more than once. + if (decoratedTypes.Add(structFieldTypes[fieldIndex])) + { + context.Decorate(structFieldTypes[fieldIndex], Decoration.ArrayStride, (LiteralInteger)fieldSize); + } - private static void DeclareUniformBuffers(CodeGenContext context, BufferDescriptor[] descriptors) - { - if (descriptors.Length == 0) - { - return; - } + offset += fieldSize * field.ArrayLength; + } + else + { + offset += fieldSize; + } + } - uint ubSize = Constants.ConstantBufferSize / 16; + var ubStructType = context.TypeStruct(false, structFieldTypes); - var ubArrayType = context.TypeArray(context.TypeVector(context.TypeFP32(), 4), context.Constant(context.TypeU32(), ubSize), true); - context.Decorate(ubArrayType, Decoration.ArrayStride, (LiteralInteger)16); - var ubStructType = context.TypeStruct(true, ubArrayType); - context.Decorate(ubStructType, Decoration.Block); - context.MemberDecorate(ubStructType, 0, Decoration.Offset, (LiteralInteger)0); + if (decoratedTypes.Add(ubStructType)) + { + context.Decorate(ubStructType, Decoration.Block); - if (context.Config.UsedFeatures.HasFlag(FeatureFlags.CbIndexing)) - { - int count = descriptors.Max(x => x.Slot) + 1; + for (int fieldIndex = 0; fieldIndex < structFieldOffsets.Length; fieldIndex++) + { + context.MemberDecorate(ubStructType, fieldIndex, Decoration.Offset, (LiteralInteger)structFieldOffsets[fieldIndex]); + } + } - var ubStructArrayType = context.TypeArray(ubStructType, context.Constant(context.TypeU32(), count)); - var ubPointerType = context.TypePointer(StorageClass.Uniform, ubStructArrayType); + var ubPointerType = context.TypePointer(StorageClass.Uniform, ubStructType); var ubVariable = context.Variable(ubPointerType, StorageClass.Uniform); - context.Name(ubVariable, $"{GetStagePrefix(context.Config.Stage)}_u"); - context.Decorate(ubVariable, Decoration.DescriptorSet, (LiteralInteger)0); - context.Decorate(ubVariable, Decoration.Binding, (LiteralInteger)context.Config.FirstConstantBufferBinding); + context.Name(ubVariable, buffer.Name); + context.Decorate(ubVariable, Decoration.DescriptorSet, (LiteralInteger)buffer.Set); + context.Decorate(ubVariable, Decoration.Binding, (LiteralInteger)buffer.Binding); context.AddGlobalVariable(ubVariable); - - context.UniformBuffersArray = ubVariable; - } - else - { - var ubPointerType = context.TypePointer(StorageClass.Uniform, ubStructType); - - foreach (var descriptor in descriptors) - { - var ubVariable = context.Variable(ubPointerType, StorageClass.Uniform); - - context.Name(ubVariable, $"{GetStagePrefix(context.Config.Stage)}_c{descriptor.Slot}"); - context.Decorate(ubVariable, Decoration.DescriptorSet, (LiteralInteger)0); - context.Decorate(ubVariable, Decoration.Binding, (LiteralInteger)descriptor.Binding); - context.AddGlobalVariable(ubVariable); - context.UniformBuffers.Add(descriptor.Slot, ubVariable); - } + context.ConstantBuffers.Add(buffer.Binding, ubVariable); } } @@ -394,25 +372,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { foreach (var ioDefinition in info.IoDefinitions) { - var ioVariable = ioDefinition.IoVariable; - - // Those are actually from constant buffer, rather than being actual inputs or outputs, - // so we must ignore them here as they are declared as part of the support buffer. - // TODO: Delete this after we represent this properly on the IR (as a constant buffer rather than "input"). - if (ioVariable == IoVariable.FragmentOutputIsBgra || - ioVariable == IoVariable.SupportBlockRenderScale || - ioVariable == IoVariable.SupportBlockViewInverse) - { - continue; - } - - bool isOutput = ioDefinition.StorageKind.IsOutput(); - bool isPerPatch = ioDefinition.StorageKind.IsPerPatch(); - PixelImap iq = PixelImap.Unused; if (context.Config.Stage == ShaderStage.Fragment) { + var ioVariable = ioDefinition.IoVariable; if (ioVariable == IoVariable.UserDefined) { iq = context.Config.ImapTypes[ioDefinition.Location].GetFirstUsedType(); @@ -429,6 +393,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } + bool isOutput = ioDefinition.StorageKind.IsOutput(); + bool isPerPatch = ioDefinition.StorageKind.IsPerPatch(); + DeclareInputOrOutput(context, ioDefinition, isOutput, isPerPatch, iq); } } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs index 6da8f29d..fda0dc47 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs @@ -98,7 +98,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Add(Instruction.ImageStore, GenerateImageStore); Add(Instruction.IsNan, GenerateIsNan); Add(Instruction.Load, GenerateLoad); - Add(Instruction.LoadConstant, GenerateLoadConstant); Add(Instruction.LoadLocal, GenerateLoadLocal); Add(Instruction.LoadShared, GenerateLoadShared); Add(Instruction.LoadStorage, GenerateLoadStorage); @@ -313,10 +312,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv for (int i = 0; i < args.Length; i++) { - var operand = (AstOperand)operation.GetSource(i + 1); + var operand = operation.GetSource(i + 1); + if (i >= function.InArguments.Length) { - args[i] = context.GetLocalPointer(operand); + args[i] = context.GetLocalPointer((AstOperand)operand); } else { @@ -867,68 +867,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv return GenerateLoadOrStore(context, operation, isStore: false); } - private static OperationResult GenerateLoadConstant(CodeGenContext context, AstOperation operation) - { - var src1 = operation.GetSource(0); - var src2 = context.Get(AggregateType.S32, operation.GetSource(1)); - - var i1 = context.Constant(context.TypeS32(), 0); - var i2 = context.ShiftRightArithmetic(context.TypeS32(), src2, context.Constant(context.TypeS32(), 2)); - var i3 = context.BitwiseAnd(context.TypeS32(), src2, context.Constant(context.TypeS32(), 3)); - - SpvInstruction value = null; - - if (context.Config.GpuAccessor.QueryHostHasVectorIndexingBug()) - { - // Test for each component individually. - for (int i = 0; i < 4; i++) - { - var component = context.Constant(context.TypeS32(), i); - - SpvInstruction elemPointer; - if (context.UniformBuffersArray != null) - { - var ubVariable = context.UniformBuffersArray; - var i0 = context.Get(AggregateType.S32, src1); - - elemPointer = context.AccessChain(context.TypePointer(StorageClass.Uniform, context.TypeFP32()), ubVariable, i0, i1, i2, component); - } - else - { - var ubVariable = context.UniformBuffers[((AstOperand)src1).Value]; - - elemPointer = context.AccessChain(context.TypePointer(StorageClass.Uniform, context.TypeFP32()), ubVariable, i1, i2, component); - } - - SpvInstruction newValue = context.Load(context.TypeFP32(), elemPointer); - - value = value != null ? context.Select(context.TypeFP32(), context.IEqual(context.TypeBool(), i3, component), newValue, value) : newValue; - } - } - else - { - SpvInstruction elemPointer; - - if (context.UniformBuffersArray != null) - { - var ubVariable = context.UniformBuffersArray; - var i0 = context.Get(AggregateType.S32, src1); - - elemPointer = context.AccessChain(context.TypePointer(StorageClass.Uniform, context.TypeFP32()), ubVariable, i0, i1, i2, i3); - } - else - { - var ubVariable = context.UniformBuffers[((AstOperand)src1).Value]; - - elemPointer = context.AccessChain(context.TypePointer(StorageClass.Uniform, context.TypeFP32()), ubVariable, i1, i2, i3); - } - - value = context.Load(context.TypeFP32(), elemPointer); - } - - return new OperationResult(AggregateType.FP32, value); - } - private static OperationResult GenerateLoadLocal(CodeGenContext context, AstOperation operation) { return GenerateLoadLocalOrShared(context, operation, StorageClass.Private, context.LocalMemory); @@ -1990,12 +1928,32 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { StorageKind storageKind = operation.StorageKind; - SpvInstruction pointer; + StorageClass storageClass; + SpvInstruction baseObj; AggregateType varType; int srcIndex = 0; switch (storageKind) { + case StorageKind.ConstantBuffer: + if (!(operation.GetSource(srcIndex++) is AstOperand bindingIndex) || bindingIndex.Type != OperandType.Constant) + { + throw new InvalidOperationException($"First input of {operation.Inst} with {storageKind} storage must be a constant operand."); + } + + if (!(operation.GetSource(srcIndex) is AstOperand fieldIndex) || fieldIndex.Type != OperandType.Constant) + { + throw new InvalidOperationException($"Second input of {operation.Inst} with {storageKind} storage must be a constant operand."); + } + + BufferDefinition buffer = context.Config.Properties.ConstantBuffers[bindingIndex.Value]; + StructureField field = buffer.Type.Fields[fieldIndex.Value]; + + storageClass = StorageClass.Uniform; + varType = field.Type & AggregateType.ElementTypeMask; + baseObj = context.ConstantBuffers[bindingIndex.Value]; + break; + case StorageKind.Input: case StorageKind.InputPerPatch: case StorageKind.Output: @@ -2038,33 +1996,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { varType = context.Config.GetFragmentOutputColorType(location); } - else if (ioVariable == IoVariable.FragmentOutputIsBgra) - { - var pointerType = context.TypePointer(StorageClass.Uniform, context.TypeU32()); - var elemIndex = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - pointer = context.AccessChain(pointerType, context.SupportBuffer, context.Constant(context.TypeU32(), 1), elemIndex); - varType = AggregateType.U32; - - break; - } - else if (ioVariable == IoVariable.SupportBlockRenderScale) - { - var pointerType = context.TypePointer(StorageClass.Uniform, context.TypeFP32()); - var elemIndex = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - pointer = context.AccessChain(pointerType, context.SupportBuffer, context.Constant(context.TypeU32(), 4), elemIndex); - varType = AggregateType.FP32; - - break; - } - else if (ioVariable == IoVariable.SupportBlockViewInverse) - { - var pointerType = context.TypePointer(StorageClass.Uniform, context.TypeFP32()); - var elemIndex = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - pointer = context.AccessChain(pointerType, context.SupportBuffer, context.Constant(context.TypeU32(), 2), elemIndex); - varType = AggregateType.FP32; - - break; - } else { (_, varType) = IoMap.GetSpirvBuiltIn(ioVariable); @@ -2072,55 +2003,57 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv varType &= AggregateType.ElementTypeMask; - int inputsCount = (isStore ? operation.SourcesCount - 1 : operation.SourcesCount) - srcIndex; - var storageClass = isOutput ? StorageClass.Output : StorageClass.Input; + storageClass = isOutput ? StorageClass.Output : StorageClass.Input; var ioDefinition = new IoDefinition(storageKind, ioVariable, location, component); var dict = isPerPatch ? (isOutput ? context.OutputsPerPatch : context.InputsPerPatch) : (isOutput ? context.Outputs : context.Inputs); - SpvInstruction baseObj = dict[ioDefinition]; - SpvInstruction e0, e1, e2; - - switch (inputsCount) - { - case 0: - pointer = baseObj; - break; - case 1: - e0 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0); - break; - case 2: - e0 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - e1 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0, e1); - break; - case 3: - e0 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - e1 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - e2 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); - pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0, e1, e2); - break; - default: - var indexes = new SpvInstruction[inputsCount]; - int index = 0; - - for (; index < inputsCount; srcIndex++, index++) - { - indexes[index] = context.Get(AggregateType.S32, operation.GetSource(srcIndex)); - } - - pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, indexes); - break; - } + baseObj = dict[ioDefinition]; break; default: throw new InvalidOperationException($"Invalid storage kind {storageKind}."); } + int inputsCount = (isStore ? operation.SourcesCount - 1 : operation.SourcesCount) - srcIndex; + SpvInstruction e0, e1, e2; + SpvInstruction pointer; + + switch (inputsCount) + { + case 0: + pointer = baseObj; + break; + case 1: + e0 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); + pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0); + break; + case 2: + e0 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); + e1 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); + pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0, e1); + break; + case 3: + e0 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); + e1 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); + e2 = context.Get(AggregateType.S32, operation.GetSource(srcIndex++)); + pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0, e1, e2); + break; + default: + var indexes = new SpvInstruction[inputsCount]; + int index = 0; + + for (; index < inputsCount; srcIndex++, index++) + { + indexes[index] = context.Get(AggregateType.S32, operation.GetSource(srcIndex)); + } + + pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, indexes); + break; + } + if (isStore) { context.Store(pointer, context.Get(varType, operation.GetSource(srcIndex))); diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/ScalingHelpers.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/ScalingHelpers.cs index f6c218c6..c8b21e88 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/ScalingHelpers.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/ScalingHelpers.cs @@ -63,7 +63,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (context.Config.Stage == ShaderStage.Vertex) { var scaleCountPointerType = context.TypePointer(StorageClass.Uniform, context.TypeS32()); - var scaleCountElemPointer = context.AccessChain(scaleCountPointerType, context.SupportBuffer, context.Constant(context.TypeU32(), 3)); + var scaleCountElemPointer = context.AccessChain(scaleCountPointerType, context.ConstantBuffers[0], context.Constant(context.TypeU32(), 3)); var scaleCount = context.Load(context.TypeS32(), scaleCountElemPointer); scaleIndex = context.IAdd(context.TypeU32(), scaleIndex, scaleCount); @@ -71,7 +71,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv scaleIndex = context.IAdd(context.TypeU32(), scaleIndex, context.Constant(context.TypeU32(), 1)); - var scaleElemPointer = context.AccessChain(pointerType, context.SupportBuffer, fieldIndex, scaleIndex); + var scaleElemPointer = context.AccessChain(pointerType, context.ConstantBuffers[0], fieldIndex, scaleIndex); var scale = context.Load(context.TypeFP32(), scaleElemPointer); var ivector2Type = context.TypeVector(context.TypeS32(), 2); @@ -201,7 +201,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (context.Config.Stage == ShaderStage.Vertex) { var scaleCountPointerType = context.TypePointer(StorageClass.Uniform, context.TypeS32()); - var scaleCountElemPointer = context.AccessChain(scaleCountPointerType, context.SupportBuffer, context.Constant(context.TypeU32(), 3)); + var scaleCountElemPointer = context.AccessChain(scaleCountPointerType, context.ConstantBuffers[0], context.Constant(context.TypeU32(), 3)); var scaleCount = context.Load(context.TypeS32(), scaleCountElemPointer); scaleIndex = context.IAdd(context.TypeU32(), scaleIndex, scaleCount); @@ -209,7 +209,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv scaleIndex = context.IAdd(context.TypeU32(), scaleIndex, context.Constant(context.TypeU32(), 1)); - var scaleElemPointer = context.AccessChain(pointerType, context.SupportBuffer, fieldIndex, scaleIndex); + var scaleElemPointer = context.AccessChain(pointerType, context.ConstantBuffers[0], fieldIndex, scaleIndex); var scale = context.GlslFAbs(context.TypeFP32(), context.Load(context.TypeFP32(), scaleElemPointer)); var passthrough = context.FOrdEqual(context.TypeBool(), scale, context.Constant(context.TypeFP32(), 1f)); |
