소스 검색

Allow bindless textures with handles from unbound constant buffer (#3706)

gdkchan 3 년 전
부모
커밋
0cb1e926b5
2개의 변경된 파일8개의 추가작업 그리고 4개의 파일을 삭제
  1. 6 2
      Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
  2. 2 2
      Ryujinx.Graphics.Shader/TextureHandle.cs

+ 6 - 2
Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs

@@ -806,7 +806,9 @@ namespace Ryujinx.Graphics.Gpu.Image
                 ? _channel.BufferManager.GetComputeUniformBufferAddress(textureBufferIndex)
                 : _channel.BufferManager.GetGraphicsUniformBufferAddress(stageIndex, textureBufferIndex);
 
-            int handle = _channel.MemoryManager.Physical.Read<int>(textureBufferAddress + (uint)textureWordOffset * 4);
+            int handle = textureBufferAddress != 0
+                ? _channel.MemoryManager.Physical.Read<int>(textureBufferAddress + (uint)textureWordOffset * 4)
+                : 0;
 
             // The "wordOffset" (which is really the immediate value used on texture instructions on the shader)
             // is a 13-bit value. However, in order to also support separate samplers and textures (which uses
@@ -824,7 +826,9 @@ namespace Ryujinx.Graphics.Gpu.Image
                         ? _channel.BufferManager.GetComputeUniformBufferAddress(samplerBufferIndex)
                         : _channel.BufferManager.GetGraphicsUniformBufferAddress(stageIndex, samplerBufferIndex);
 
-                    samplerHandle = _channel.MemoryManager.Physical.Read<int>(samplerBufferAddress + (uint)samplerWordOffset * 4);
+                    samplerHandle = samplerBufferAddress != 0
+                        ? _channel.MemoryManager.Physical.Read<int>(samplerBufferAddress + (uint)samplerWordOffset * 4)
+                        : 0;
                 }
                 else
                 {

+ 2 - 2
Ryujinx.Graphics.Shader/TextureHandle.cs

@@ -88,7 +88,7 @@ namespace Ryujinx.Graphics.Shader
         {
             (int textureWordOffset, int samplerWordOffset, TextureHandleType handleType) = UnpackOffsets(wordOffset);
 
-            int handle = cachedTextureBuffer[textureWordOffset];
+            int handle = cachedTextureBuffer.Length != 0 ? cachedTextureBuffer[textureWordOffset] : 0;
 
             // The "wordOffset" (which is really the immediate value used on texture instructions on the shader)
             // is a 13-bit value. However, in order to also support separate samplers and textures (which uses
@@ -102,7 +102,7 @@ namespace Ryujinx.Graphics.Shader
 
                 if (handleType != TextureHandleType.SeparateConstantSamplerHandle)
                 {
-                    samplerHandle = cachedSamplerBuffer[samplerWordOffset];
+                    samplerHandle = cachedSamplerBuffer.Length != 0 ? cachedSamplerBuffer[samplerWordOffset] : 0;
                 }
                 else
                 {