diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 36 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 3 |
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 | ||
| 1019 | TextureBufferUsage 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 | |||
| 1019 | bool RasterizerOpenGL::SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture, | 1049 | bool 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); |