diff options
| author | 2018-04-14 11:45:23 -0500 | |
|---|---|---|
| committer | 2018-04-14 22:54:23 -0500 | |
| commit | 1957640ea25b34bec9e356a06dadf5937933c4ef (patch) | |
| tree | 62fb25a03d53e032bfada62a525e2d23be1570e8 /src | |
| parent | GPU: Added a function to determine whether a shader stage is enabled or not. (diff) | |
| download | yuzu-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.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.h | 6 |
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 { |