summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-26 04:17:02 -0300
committerGravatar ReinUsesLisp2020-02-28 17:36:40 -0300
commit17a7fa751b34ae67c600bd741969dc1bde40fbf3 (patch)
treef6d22f2c38b8f8bd64c362e84412692e0c16f0fe
parentgl_state: Remove texture and sampler tracking (diff)
downloadyuzu-17a7fa751b34ae67c600bd741969dc1bde40fbf3.tar.gz
yuzu-17a7fa751b34ae67c600bd741969dc1bde40fbf3.tar.xz
yuzu-17a7fa751b34ae67c600bd741969dc1bde40fbf3.zip
gl_state: Remove image tracking
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp6
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp7
-rw-r--r--src/video_core/renderer_opengl/gl_state.h4
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp14
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h5
5 files changed, 12 insertions, 24 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 669a7c335..1f94f759d 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -633,7 +633,6 @@ void RasterizerOpenGL::DispatchCompute(GPUVAddr code_addr) {
633 bind_ubo_pushbuffer.Bind(); 633 bind_ubo_pushbuffer.Bind();
634 bind_ssbo_pushbuffer.Bind(); 634 bind_ssbo_pushbuffer.Bind();
635 635
636 state.ApplyImages();
637 state.ApplyShaderProgram(); 636 state.ApplyShaderProgram();
638 state.ApplyProgramPipeline(); 637 state.ApplyProgramPipeline();
639 638
@@ -899,7 +898,7 @@ void RasterizerOpenGL::SetupImage(u32 binding, const Tegra::Texture::TICEntry& t
899 const GLShader::ImageEntry& entry) { 898 const GLShader::ImageEntry& entry) {
900 const auto view = texture_cache.GetImageSurface(tic, entry); 899 const auto view = texture_cache.GetImageSurface(tic, entry);
901 if (!view) { 900 if (!view) {
902 state.images[binding] = 0; 901 glBindImageTexture(binding, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8);
903 return; 902 return;
904 } 903 }
905 if (!tic.IsBuffer()) { 904 if (!tic.IsBuffer()) {
@@ -908,7 +907,8 @@ void RasterizerOpenGL::SetupImage(u32 binding, const Tegra::Texture::TICEntry& t
908 if (entry.IsWritten()) { 907 if (entry.IsWritten()) {
909 view->MarkAsModified(texture_cache.Tick()); 908 view->MarkAsModified(texture_cache.Tick());
910 } 909 }
911 state.images[binding] = view->GetTexture(); 910 glBindImageTexture(binding, view->GetTexture(), 0, GL_TRUE, 0, GL_READ_WRITE,
911 view->GetFormat());
912} 912}
913 913
914void RasterizerOpenGL::SyncViewport() { 914void RasterizerOpenGL::SyncViewport() {
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp
index 98de72b5f..7bb87f7ba 100644
--- a/src/video_core/renderer_opengl/gl_state.cpp
+++ b/src/video_core/renderer_opengl/gl_state.cpp
@@ -113,18 +113,11 @@ void OpenGLState::ApplyRenderBuffer() {
113 } 113 }
114} 114}
115 115
116void OpenGLState::ApplyImages() {
117 if (const auto update = UpdateArray(cur_state.images, images)) {
118 glBindImageTextures(update->first, update->second, images.data() + update->first);
119 }
120}
121
122void OpenGLState::Apply() { 116void OpenGLState::Apply() {
123 MICROPROFILE_SCOPE(OpenGL_State); 117 MICROPROFILE_SCOPE(OpenGL_State);
124 ApplyFramebufferState(); 118 ApplyFramebufferState();
125 ApplyShaderProgram(); 119 ApplyShaderProgram();
126 ApplyProgramPipeline(); 120 ApplyProgramPipeline();
127 ApplyImages();
128 ApplyRenderBuffer(); 121 ApplyRenderBuffer();
129} 122}
130 123
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h
index 25dd56452..4e34fcfc2 100644
--- a/src/video_core/renderer_opengl/gl_state.h
+++ b/src/video_core/renderer_opengl/gl_state.h
@@ -13,9 +13,6 @@ namespace OpenGL {
13 13
14class OpenGLState { 14class OpenGLState {
15public: 15public:
16 static constexpr std::size_t NumImages = 8 * 5;
17 std::array<GLuint, NumImages> images = {};
18
19 struct { 16 struct {
20 GLuint read_framebuffer = 0; // GL_READ_FRAMEBUFFER_BINDING 17 GLuint read_framebuffer = 0; // GL_READ_FRAMEBUFFER_BINDING
21 GLuint draw_framebuffer = 0; // GL_DRAW_FRAMEBUFFER_BINDING 18 GLuint draw_framebuffer = 0; // GL_DRAW_FRAMEBUFFER_BINDING
@@ -38,7 +35,6 @@ public:
38 void ApplyFramebufferState(); 35 void ApplyFramebufferState();
39 void ApplyShaderProgram(); 36 void ApplyShaderProgram();
40 void ApplyProgramPipeline(); 37 void ApplyProgramPipeline();
41 void ApplyImages();
42 void ApplyRenderBuffer(); 38 void ApplyRenderBuffer();
43 39
44 /// Resets any references to the given resource 40 /// Resets any references to the given resource
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index f7a1ca3a9..ca407c1b3 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -397,6 +397,7 @@ CachedSurfaceView::CachedSurfaceView(CachedSurface& surface, const ViewParams& p
397 const bool is_proxy) 397 const bool is_proxy)
398 : VideoCommon::ViewBase(params), surface{surface}, is_proxy{is_proxy} { 398 : VideoCommon::ViewBase(params), surface{surface}, is_proxy{is_proxy} {
399 target = GetTextureTarget(params.target); 399 target = GetTextureTarget(params.target);
400 format = GetFormatTuple(surface.GetSurfaceParams().pixel_format).internal_format;
400 if (!is_proxy) { 401 if (!is_proxy) {
401 texture_view = CreateTextureView(); 402 texture_view = CreateTextureView();
402 } 403 }
@@ -467,17 +468,12 @@ void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_sou
467} 468}
468 469
469OGLTextureView CachedSurfaceView::CreateTextureView() const { 470OGLTextureView CachedSurfaceView::CreateTextureView() const {
470 const auto& owner_params = surface.GetSurfaceParams();
471 OGLTextureView texture_view; 471 OGLTextureView texture_view;
472 texture_view.Create(); 472 texture_view.Create();
473 473
474 const GLuint handle{texture_view.handle}; 474 glTextureView(texture_view.handle, target, surface.texture.handle, format, params.base_level,
475 const FormatTuple& tuple{GetFormatTuple(owner_params.pixel_format)};
476
477 glTextureView(handle, target, surface.texture.handle, tuple.internal_format, params.base_level,
478 params.num_levels, params.base_layer, params.num_layers); 475 params.num_levels, params.base_layer, params.num_layers);
479 476 ApplyTextureDefaults(surface.GetSurfaceParams(), texture_view.handle);
480 ApplyTextureDefaults(owner_params, handle);
481 477
482 return texture_view; 478 return texture_view;
483} 479}
@@ -521,9 +517,7 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view,
521 const auto& dst_params{dst_view->GetSurfaceParams()}; 517 const auto& dst_params{dst_view->GetSurfaceParams()};
522 518
523 OpenGLState prev_state{OpenGLState::GetCurState()}; 519 OpenGLState prev_state{OpenGLState::GetCurState()};
524 SCOPE_EXIT({ 520 SCOPE_EXIT({ prev_state.Apply(); });
525 prev_state.Apply();
526 });
527 521
528 OpenGLState state; 522 OpenGLState state;
529 state.draw.read_framebuffer = src_framebuffer.handle; 523 state.draw.read_framebuffer = src_framebuffer.handle;
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index 8e13ab38b..303534ca6 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -96,6 +96,10 @@ public:
96 return texture_view.handle; 96 return texture_view.handle;
97 } 97 }
98 98
99 GLenum GetFormat() const {
100 return format;
101 }
102
99 const SurfaceParams& GetSurfaceParams() const { 103 const SurfaceParams& GetSurfaceParams() const {
100 return surface.GetSurfaceParams(); 104 return surface.GetSurfaceParams();
101 } 105 }
@@ -113,6 +117,7 @@ private:
113 117
114 CachedSurface& surface; 118 CachedSurface& surface;
115 GLenum target{}; 119 GLenum target{};
120 GLenum format{};
116 121
117 OGLTextureView texture_view; 122 OGLTextureView texture_view;
118 u32 swizzle{}; 123 u32 swizzle{};