summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2018-04-14 11:45:23 -0500
committerGravatar Subv2018-04-14 22:54:23 -0500
commit1957640ea25b34bec9e356a06dadf5937933c4ef (patch)
tree62fb25a03d53e032bfada62a525e2d23be1570e8 /src
parentGPU: Added a function to determine whether a shader stage is enabled or not. (diff)
downloadyuzu-1957640ea25b34bec9e356a06dadf5937933c4ef.tar.gz
yuzu-1957640ea25b34bec9e356a06dadf5937933c4ef.tar.xz
yuzu-1957640ea25b34bec9e356a06dadf5937933c4ef.zip
GPU: Allow configuring ssbos in the opengl state manager.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h2
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp14
-rw-r--r--src/video_core/renderer_opengl/gl_state.h6
4 files changed, 30 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index adc684f9e..71b862114 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -46,6 +46,14 @@ RasterizerOpenGL::RasterizerOpenGL() {
46 state.texture_units[i].sampler = texture_samplers[i].sampler.handle; 46 state.texture_units[i].sampler = texture_samplers[i].sampler.handle;
47 } 47 }
48 48
49 // Create SSBOs
50 for (size_t stage = 0; stage < ssbos.size(); ++stage) {
51 for (size_t buffer = 0; buffer < ssbos[stage].size(); ++buffer) {
52 ssbos[stage][buffer].Create();
53 state.draw.const_buffers[stage][buffer].ssbo = ssbos[stage][buffer].handle;
54 }
55 }
56
49 GLint ext_num; 57 GLint ext_num;
50 glGetIntegerv(GL_NUM_EXTENSIONS, &ext_num); 58 glGetIntegerv(GL_NUM_EXTENSIONS, &ext_num);
51 for (GLint i = 0; i < ext_num; i++) { 59 for (GLint i = 0; i < ext_num; i++) {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 71c21c69b..527866e8a 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -129,6 +129,8 @@ private:
129 std::array<bool, 16> hw_vao_enabled_attributes; 129 std::array<bool, 16> hw_vao_enabled_attributes;
130 130
131 std::array<SamplerInfo, GLShader::NumTextureSamplers> texture_samplers; 131 std::array<SamplerInfo, GLShader::NumTextureSamplers> texture_samplers;
132 std::array<std::array<OGLBuffer, 16>, 5> ssbos;
133
132 static constexpr size_t VERTEX_BUFFER_SIZE = 128 * 1024 * 1024; 134 static constexpr size_t VERTEX_BUFFER_SIZE = 128 * 1024 * 1024;
133 std::unique_ptr<OGLStreamBuffer> vertex_buffer; 135 std::unique_ptr<OGLStreamBuffer> vertex_buffer;
134 OGLBuffer uniform_buffer; 136 OGLBuffer uniform_buffer;
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp
index 6da3a7781..7b8a15ed2 100644
--- a/src/video_core/renderer_opengl/gl_state.cpp
+++ b/src/video_core/renderer_opengl/gl_state.cpp
@@ -202,6 +202,20 @@ void OpenGLState::Apply() const {
202 } 202 }
203 } 203 }
204 204
205 // Constbuffers
206 for (u32 stage = 0; stage < draw.const_buffers.size(); ++stage) {
207 for (u32 buffer_id = 0; buffer_id < draw.const_buffers[stage].size(); ++buffer_id) {
208 auto& current = cur_state.draw.const_buffers[stage][buffer_id];
209 auto& new_state = draw.const_buffers[stage][buffer_id];
210 if (current.enabled != new_state.enabled || current.bindpoint != new_state.bindpoint ||
211 current.ssbo != new_state.ssbo) {
212 if (new_state.enabled) {
213 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, new_state.bindpoint, new_state.ssbo);
214 }
215 }
216 }
217 }
218
205 // Lighting LUTs 219 // Lighting LUTs
206 if (lighting_lut.texture_buffer != cur_state.lighting_lut.texture_buffer) { 220 if (lighting_lut.texture_buffer != cur_state.lighting_lut.texture_buffer) {
207 glActiveTexture(TextureUnits::LightingLUT.Enum()); 221 glActiveTexture(TextureUnits::LightingLUT.Enum());
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h
index b18af14bb..6a80e6a7d 100644
--- a/src/video_core/renderer_opengl/gl_state.h
+++ b/src/video_core/renderer_opengl/gl_state.h
@@ -123,6 +123,12 @@ public:
123 GLuint uniform_buffer; // GL_UNIFORM_BUFFER_BINDING 123 GLuint uniform_buffer; // GL_UNIFORM_BUFFER_BINDING
124 GLuint shader_program; // GL_CURRENT_PROGRAM 124 GLuint shader_program; // GL_CURRENT_PROGRAM
125 GLuint program_pipeline; // GL_PROGRAM_PIPELINE_BINDING 125 GLuint program_pipeline; // GL_PROGRAM_PIPELINE_BINDING
126 struct ConstBufferConfig {
127 bool enabled;
128 GLuint bindpoint;
129 GLuint ssbo;
130 };
131 std::array<std::array<ConstBufferConfig, 16>, 5> const_buffers{};
126 } draw; 132 } draw;
127 133
128 struct { 134 struct {