summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp43
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h8
2 files changed, 31 insertions, 20 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 818e71754..5454bacb0 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -998,17 +998,17 @@ TextureBufferUsage RasterizerOpenGL::SetupDrawTextures(Maxwell::ShaderStage stag
998 998
999 for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) { 999 for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
1000 const auto& entry = entries[bindpoint]; 1000 const auto& entry = entries[bindpoint];
1001 Tegra::Texture::FullTextureInfo texture; 1001 const auto texture = [&]() {
1002 if (entry.IsBindless()) { 1002 if (!entry.IsBindless()) {
1003 return maxwell3d.GetStageTexture(stage, entry.GetOffset());
1004 }
1003 const auto cbuf = entry.GetBindlessCBuf(); 1005 const auto cbuf = entry.GetBindlessCBuf();
1004 Tegra::Texture::TextureHandle tex_handle; 1006 Tegra::Texture::TextureHandle tex_handle;
1005 tex_handle.raw = maxwell3d.AccessConstBuffer32(stage, cbuf.first, cbuf.second); 1007 tex_handle.raw = maxwell3d.AccessConstBuffer32(stage, cbuf.first, cbuf.second);
1006 texture = maxwell3d.GetTextureInfo(tex_handle, entry.GetOffset()); 1008 return maxwell3d.GetTextureInfo(tex_handle, entry.GetOffset());
1007 } else { 1009 }();
1008 texture = maxwell3d.GetStageTexture(stage, entry.GetOffset());
1009 }
1010 1010
1011 if (SetupTexture(shader, base_bindings.sampler + bindpoint, texture, entry)) { 1011 if (SetupTexture(base_bindings.sampler + bindpoint, texture, entry)) {
1012 texture_buffer_usage.set(bindpoint); 1012 texture_buffer_usage.set(bindpoint);
1013 } 1013 }
1014 } 1014 }
@@ -1016,8 +1016,7 @@ TextureBufferUsage RasterizerOpenGL::SetupDrawTextures(Maxwell::ShaderStage stag
1016 return texture_buffer_usage; 1016 return texture_buffer_usage;
1017} 1017}
1018 1018
1019bool RasterizerOpenGL::SetupTexture(const Shader& shader, u32 binding, 1019bool RasterizerOpenGL::SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture,
1020 const Tegra::Texture::FullTextureInfo& texture,
1021 const GLShader::SamplerEntry& entry) { 1020 const GLShader::SamplerEntry& entry) {
1022 state.samplers[binding] = sampler_cache.GetSampler(texture.tsc); 1021 state.samplers[binding] = sampler_cache.GetSampler(texture.tsc);
1023 1022
@@ -1044,22 +1043,30 @@ void RasterizerOpenGL::SetupComputeImages(const Shader& shader) {
1044 const auto& entries = shader->GetShaderEntries().images; 1043 const auto& entries = shader->GetShaderEntries().images;
1045 for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) { 1044 for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
1046 const auto& entry = entries[bindpoint]; 1045 const auto& entry = entries[bindpoint];
1047 const auto texture = [&]() { 1046 const auto tic = [&]() {
1048 if (!entry.IsBindless()) { 1047 if (!entry.IsBindless()) {
1049 return compute.GetTexture(entry.GetOffset()); 1048 return compute.GetTexture(entry.GetOffset()).tic;
1050 } 1049 }
1051 const auto cbuf = entry.GetBindlessCBuf(); 1050 const auto cbuf = entry.GetBindlessCBuf();
1052 Tegra::Texture::TextureHandle tex_handle; 1051 Tegra::Texture::TextureHandle tex_handle;
1053 tex_handle.raw = compute.AccessConstBuffer32(cbuf.first, cbuf.second); 1052 tex_handle.raw = compute.AccessConstBuffer32(cbuf.first, cbuf.second);
1054 return compute.GetTextureInfo(tex_handle, entry.GetOffset()); 1053 return compute.GetTextureInfo(tex_handle, entry.GetOffset()).tic;
1055 }(); 1054 }();
1056 const auto view = texture_cache.GetImageSurface(texture.tic, entry); 1055 SetupImage(bindpoint, tic, entry);
1057 if (!view) { 1056 }
1058 state.images[bindpoint] = 0; 1057}
1059 continue; 1058
1060 } 1059void RasterizerOpenGL::SetupImage(u32 binding, const Tegra::Texture::TICEntry& tic,
1061 state.images[bindpoint] = view->GetTexture(); 1060 const GLShader::ImageEntry& entry) {
1061 const auto view = texture_cache.GetImageSurface(tic, entry);
1062 if (!view) {
1063 state.images[binding] = 0;
1064 return;
1065 }
1066 if (!tic.IsBuffer()) {
1067 view->ApplySwizzle(tic.x_source, tic.y_source, tic.z_source, tic.w_source);
1062 } 1068 }
1069 state.images[binding] = view->GetTexture();
1063} 1070}
1064 1071
1065void RasterizerOpenGL::SyncViewport(OpenGLState& current_state) { 1072void RasterizerOpenGL::SyncViewport(OpenGLState& current_state) {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 6fa1b7ec4..35265b4a2 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -142,12 +142,16 @@ private:
142 const Shader& shader, BaseBindings base_bindings); 142 const Shader& shader, BaseBindings base_bindings);
143 143
144 /// Configures a texture. Returns true when the texture is a texture buffer. 144 /// Configures a texture. Returns true when the texture is a texture buffer.
145 bool SetupTexture(const Shader& shader, u32 binding, 145 bool SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture,
146 const Tegra::Texture::FullTextureInfo& texture,
147 const GLShader::SamplerEntry& entry); 146 const GLShader::SamplerEntry& entry);
148 147
148 /// Configures images in a compute shader.
149 void SetupComputeImages(const Shader& shader); 149 void SetupComputeImages(const Shader& shader);
150 150
151 /// Configures an image.
152 void SetupImage(u32 binding, const Tegra::Texture::TICEntry& tic,
153 const GLShader::ImageEntry& entry);
154
151 /// Syncs the viewport and depth range to match the guest state 155 /// Syncs the viewport and depth range to match the guest state
152 void SyncViewport(OpenGLState& current_state); 156 void SyncViewport(OpenGLState& current_state);
153 157