mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	shader: Simplify indexed sampler usages
This commit is contained in:
		
							parent
							
								
									2b4cdb73b6
								
							
						
					
					
						commit
						1dda77d392
					
				@ -36,6 +36,7 @@ namespace OpenGL {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
 | 
					using Maxwell = Tegra::Engines::Maxwell3D::Regs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using Tegra::Engines::ShaderType;
 | 
				
			||||||
using VideoCore::Surface::PixelFormat;
 | 
					using VideoCore::Surface::PixelFormat;
 | 
				
			||||||
using VideoCore::Surface::SurfaceTarget;
 | 
					using VideoCore::Surface::SurfaceTarget;
 | 
				
			||||||
using VideoCore::Surface::SurfaceType;
 | 
					using VideoCore::Surface::SurfaceType;
 | 
				
			||||||
@ -56,8 +57,7 @@ namespace {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
template <typename Engine, typename Entry>
 | 
					template <typename Engine, typename Entry>
 | 
				
			||||||
Tegra::Texture::FullTextureInfo GetTextureInfo(const Engine& engine, const Entry& entry,
 | 
					Tegra::Texture::FullTextureInfo GetTextureInfo(const Engine& engine, const Entry& entry,
 | 
				
			||||||
                                               Tegra::Engines::ShaderType shader_type,
 | 
					                                               ShaderType shader_type, std::size_t index = 0) {
 | 
				
			||||||
                                               std::size_t index = 0) {
 | 
					 | 
				
			||||||
    if (entry.IsBindless()) {
 | 
					    if (entry.IsBindless()) {
 | 
				
			||||||
        const Tegra::Texture::TextureHandle tex_handle =
 | 
					        const Tegra::Texture::TextureHandle tex_handle =
 | 
				
			||||||
            engine.AccessConstBuffer32(shader_type, entry.GetBuffer(), entry.GetOffset());
 | 
					            engine.AccessConstBuffer32(shader_type, entry.GetBuffer(), entry.GetOffset());
 | 
				
			||||||
@ -910,15 +910,10 @@ void RasterizerOpenGL::SetupDrawTextures(std::size_t stage_index, const Shader&
 | 
				
			|||||||
    const auto& maxwell3d = system.GPU().Maxwell3D();
 | 
					    const auto& maxwell3d = system.GPU().Maxwell3D();
 | 
				
			||||||
    u32 binding = device.GetBaseBindings(stage_index).sampler;
 | 
					    u32 binding = device.GetBaseBindings(stage_index).sampler;
 | 
				
			||||||
    for (const auto& entry : shader->GetShaderEntries().samplers) {
 | 
					    for (const auto& entry : shader->GetShaderEntries().samplers) {
 | 
				
			||||||
        const auto shader_type = static_cast<Tegra::Engines::ShaderType>(stage_index);
 | 
					        const auto shader_type = static_cast<ShaderType>(stage_index);
 | 
				
			||||||
        if (!entry.IsIndexed()) {
 | 
					        for (std::size_t i = 0; i < entry.Size(); ++i) {
 | 
				
			||||||
            const auto texture = GetTextureInfo(maxwell3d, entry, shader_type);
 | 
					            const auto texture = GetTextureInfo(maxwell3d, entry, shader_type, i);
 | 
				
			||||||
            SetupTexture(binding++, texture, entry);
 | 
					            SetupTexture(binding++, texture, entry);
 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            for (std::size_t i = 0; i < entry.Size(); ++i) {
 | 
					 | 
				
			||||||
                const auto texture = GetTextureInfo(maxwell3d, entry, shader_type, i);
 | 
					 | 
				
			||||||
                SetupTexture(binding++, texture, entry);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -928,16 +923,9 @@ void RasterizerOpenGL::SetupComputeTextures(const Shader& kernel) {
 | 
				
			|||||||
    const auto& compute = system.GPU().KeplerCompute();
 | 
					    const auto& compute = system.GPU().KeplerCompute();
 | 
				
			||||||
    u32 binding = 0;
 | 
					    u32 binding = 0;
 | 
				
			||||||
    for (const auto& entry : kernel->GetShaderEntries().samplers) {
 | 
					    for (const auto& entry : kernel->GetShaderEntries().samplers) {
 | 
				
			||||||
        if (!entry.IsIndexed()) {
 | 
					        for (std::size_t i = 0; i < entry.Size(); ++i) {
 | 
				
			||||||
            const auto texture =
 | 
					            const auto texture = GetTextureInfo(compute, entry, ShaderType::Compute, i);
 | 
				
			||||||
                GetTextureInfo(compute, entry, Tegra::Engines::ShaderType::Compute);
 | 
					 | 
				
			||||||
            SetupTexture(binding++, texture, entry);
 | 
					            SetupTexture(binding++, texture, entry);
 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            for (std::size_t i = 0; i < entry.Size(); ++i) {
 | 
					 | 
				
			||||||
                const auto texture =
 | 
					 | 
				
			||||||
                    GetTextureInfo(compute, entry, Tegra::Engines::ShaderType::Compute, i);
 | 
					 | 
				
			||||||
                SetupTexture(binding++, texture, entry);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -299,7 +299,7 @@ private:
 | 
				
			|||||||
    u32 index{};  ///< Emulated index given for the this sampler.
 | 
					    u32 index{};  ///< Emulated index given for the this sampler.
 | 
				
			||||||
    u32 offset{}; ///< Offset in the const buffer from where the sampler is being read.
 | 
					    u32 offset{}; ///< Offset in the const buffer from where the sampler is being read.
 | 
				
			||||||
    u32 buffer{}; ///< Buffer where the bindless sampler is being read (unused on bound samplers).
 | 
					    u32 buffer{}; ///< Buffer where the bindless sampler is being read (unused on bound samplers).
 | 
				
			||||||
    u32 size{};   ///< Size of the sampler if indexed.
 | 
					    u32 size{1};  ///< Size of the sampler.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Tegra::Shader::TextureType type{}; ///< The type used to sample this texture (Texture2D, etc)
 | 
					    Tegra::Shader::TextureType type{}; ///< The type used to sample this texture (Texture2D, etc)
 | 
				
			||||||
    bool is_array{};    ///< Whether the texture is being sampled as an array texture or not.
 | 
					    bool is_array{};    ///< Whether the texture is being sampled as an array texture or not.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user