summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-07-17 21:50:21 -0300
committerGravatar ReinUsesLisp2019-09-05 20:35:51 -0300
commit80ec2feee8731d661bc999c9f057159ec6286043 (patch)
treec4d3aaed481e729614c732a46e3f930dc4f0dd4f /src
parentgl_rasterizer: Minor code changes (diff)
downloadyuzu-80ec2feee8731d661bc999c9f057159ec6286043.tar.gz
yuzu-80ec2feee8731d661bc999c9f057159ec6286043.tar.xz
yuzu-80ec2feee8731d661bc999c9f057159ec6286043.zip
gl_rasterizer: Add samplers to compute dispatches
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp36
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h3
2 files changed, 36 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 5454bacb0..fd4753af7 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -801,9 +801,11 @@ void RasterizerOpenGL::DispatchCompute(GPUVAddr code_addr) {
801 } 801 }
802 802
803 auto kernel = shader_cache.GetComputeKernel(code_addr); 803 auto kernel = shader_cache.GetComputeKernel(code_addr);
804 ProgramVariant variant;
805 variant.texture_buffer_usage = SetupComputeTextures(kernel);
804 SetupComputeImages(kernel); 806 SetupComputeImages(kernel);
805 807
806 const auto [program, next_bindings] = kernel->GetProgramHandle({}); 808 const auto [program, next_bindings] = kernel->GetProgramHandle(variant);
807 state.draw.shader_program = program; 809 state.draw.shader_program = program;
808 state.draw.program_pipeline = 0; 810 state.draw.program_pipeline = 0;
809 811
@@ -818,8 +820,6 @@ void RasterizerOpenGL::DispatchCompute(GPUVAddr code_addr) {
818 SetupComputeConstBuffers(kernel); 820 SetupComputeConstBuffers(kernel);
819 SetupComputeGlobalMemory(kernel); 821 SetupComputeGlobalMemory(kernel);
820 822
821 // TODO(Rodrigo): Bind images and samplers
822
823 buffer_cache.Unmap(); 823 buffer_cache.Unmap();
824 824
825 bind_ubo_pushbuffer.Bind(); 825 bind_ubo_pushbuffer.Bind();
@@ -1016,6 +1016,36 @@ TextureBufferUsage RasterizerOpenGL::SetupDrawTextures(Maxwell::ShaderStage stag
1016 return texture_buffer_usage; 1016 return texture_buffer_usage;
1017} 1017}
1018 1018
1019TextureBufferUsage RasterizerOpenGL::SetupComputeTextures(const Shader& kernel) {
1020 MICROPROFILE_SCOPE(OpenGL_Texture);
1021 const auto& compute = system.GPU().KeplerCompute();
1022 const auto& entries = kernel->GetShaderEntries().samplers;
1023
1024 ASSERT_MSG(entries.size() <= std::size(state.textures),
1025 "Exceeded the number of active textures.");
1026
1027 TextureBufferUsage texture_buffer_usage{0};
1028
1029 for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
1030 const auto& entry = entries[bindpoint];
1031 const auto texture = [&]() {
1032 if (!entry.IsBindless()) {
1033 return compute.GetTexture(entry.GetOffset());
1034 }
1035 const auto cbuf = entry.GetBindlessCBuf();
1036 Tegra::Texture::TextureHandle tex_handle;
1037 tex_handle.raw = compute.AccessConstBuffer32(cbuf.first, cbuf.second);
1038 return compute.GetTextureInfo(tex_handle, entry.GetOffset());
1039 }();
1040
1041 if (SetupTexture(bindpoint, texture, entry)) {
1042 texture_buffer_usage.set(bindpoint);
1043 }
1044 }
1045
1046 return texture_buffer_usage;
1047}
1048
1019bool RasterizerOpenGL::SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture, 1049bool RasterizerOpenGL::SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture,
1020 const GLShader::SamplerEntry& entry) { 1050 const GLShader::SamplerEntry& entry) {
1021 state.samplers[binding] = sampler_cache.GetSampler(texture.tsc); 1051 state.samplers[binding] = sampler_cache.GetSampler(texture.tsc);
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 35265b4a2..eada752e0 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -141,6 +141,9 @@ private:
141 TextureBufferUsage SetupDrawTextures(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, 141 TextureBufferUsage SetupDrawTextures(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage,
142 const Shader& shader, BaseBindings base_bindings); 142 const Shader& shader, BaseBindings base_bindings);
143 143
144 /// Configures the textures used in a compute shader. Returns texture buffer usage.
145 TextureBufferUsage SetupComputeTextures(const Shader& kernel);
146
144 /// Configures a texture. Returns true when the texture is a texture buffer. 147 /// Configures a texture. Returns true when the texture is a texture buffer.
145 bool SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture, 148 bool SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture,
146 const GLShader::SamplerEntry& entry); 149 const GLShader::SamplerEntry& entry);