diff options
| author | 2019-04-10 15:56:12 -0300 | |
|---|---|---|
| committer | 2019-04-10 15:56:12 -0300 | |
| commit | 0032821864a679d09c252249c74d1bf8deef9baa (patch) | |
| tree | 46e6c5b4e1bbcd7d920a6fbd742148b904f8a8bf | |
| parent | Merge pull request #2345 from ReinUsesLisp/multibind (diff) | |
| download | yuzu-0032821864a679d09c252249c74d1bf8deef9baa.tar.gz yuzu-0032821864a679d09c252249c74d1bf8deef9baa.tar.xz yuzu-0032821864a679d09c252249c74d1bf8deef9baa.zip | |
gl_device: Implement interface and add uniform offset alignment
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_device.cpp | 27 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_device.h | 25 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 25 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 4 |
5 files changed, 70 insertions, 13 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 242a0d1cd..5de3eb686 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -36,6 +36,8 @@ add_library(video_core STATIC | |||
| 36 | renderer_base.h | 36 | renderer_base.h |
| 37 | renderer_opengl/gl_buffer_cache.cpp | 37 | renderer_opengl/gl_buffer_cache.cpp |
| 38 | renderer_opengl/gl_buffer_cache.h | 38 | renderer_opengl/gl_buffer_cache.h |
| 39 | renderer_opengl/gl_device.cpp | ||
| 40 | renderer_opengl/gl_device.h | ||
| 39 | renderer_opengl/gl_global_cache.cpp | 41 | renderer_opengl/gl_global_cache.cpp |
| 40 | renderer_opengl/gl_global_cache.h | 42 | renderer_opengl/gl_global_cache.h |
| 41 | renderer_opengl/gl_primitive_assembler.cpp | 43 | renderer_opengl/gl_primitive_assembler.cpp |
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp new file mode 100644 index 000000000..b7ca3dca4 --- /dev/null +++ b/src/video_core/renderer_opengl/gl_device.cpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright 2019 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <cstddef> | ||
| 6 | #include <glad/glad.h> | ||
| 7 | |||
| 8 | #include "video_core/renderer_opengl/gl_device.h" | ||
| 9 | |||
| 10 | namespace OpenGL { | ||
| 11 | |||
| 12 | namespace { | ||
| 13 | template <typename T> | ||
| 14 | T GetInteger(GLenum pname) { | ||
| 15 | GLint temporary; | ||
| 16 | glGetIntegerv(pname, &temporary); | ||
| 17 | return static_cast<T>(temporary); | ||
| 18 | } | ||
| 19 | } // Anonymous namespace | ||
| 20 | |||
| 21 | Device::Device() = default; | ||
| 22 | |||
| 23 | void Device::Initialize() { | ||
| 24 | uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT); | ||
| 25 | } | ||
| 26 | |||
| 27 | } // namespace OpenGL | ||
diff --git a/src/video_core/renderer_opengl/gl_device.h b/src/video_core/renderer_opengl/gl_device.h new file mode 100644 index 000000000..3085e04ad --- /dev/null +++ b/src/video_core/renderer_opengl/gl_device.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | // Copyright 2019 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <cstddef> | ||
| 8 | |||
| 9 | namespace OpenGL { | ||
| 10 | |||
| 11 | class Device { | ||
| 12 | public: | ||
| 13 | Device(); | ||
| 14 | |||
| 15 | void Initialize(); | ||
| 16 | |||
| 17 | std::size_t GetUniformBufferAlignment() const { | ||
| 18 | return uniform_buffer_alignment; | ||
| 19 | } | ||
| 20 | |||
| 21 | private: | ||
| 22 | std::size_t uniform_buffer_alignment{}; | ||
| 23 | }; | ||
| 24 | |||
| 25 | } // namespace OpenGL | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index d250d5cbb..2d638aa4e 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -107,14 +107,14 @@ RasterizerOpenGL::RasterizerOpenGL(Core::System& system, ScreenInfo& info) | |||
| 107 | state.texture_units[i].sampler = texture_samplers[i].sampler.handle; | 107 | state.texture_units[i].sampler = texture_samplers[i].sampler.handle; |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | device.Initialize(); | ||
| 111 | |||
| 110 | OpenGLState::ApplyDefaultState(); | 112 | OpenGLState::ApplyDefaultState(); |
| 111 | 113 | ||
| 112 | shader_program_manager = std::make_unique<GLShader::ProgramManager>(); | 114 | shader_program_manager = std::make_unique<GLShader::ProgramManager>(); |
| 113 | state.draw.shader_program = 0; | 115 | state.draw.shader_program = 0; |
| 114 | state.Apply(); | 116 | state.Apply(); |
| 115 | 117 | ||
| 116 | glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uniform_buffer_alignment); | ||
| 117 | |||
| 118 | LOG_DEBUG(Render_OpenGL, "Sync fixed function OpenGL state here"); | 118 | LOG_DEBUG(Render_OpenGL, "Sync fixed function OpenGL state here"); |
| 119 | CheckExtensions(); | 119 | CheckExtensions(); |
| 120 | } | 120 | } |
| @@ -321,8 +321,8 @@ void RasterizerOpenGL::SetupShaders(GLenum primitive_mode) { | |||
| 321 | 321 | ||
| 322 | GLShader::MaxwellUniformData ubo{}; | 322 | GLShader::MaxwellUniformData ubo{}; |
| 323 | ubo.SetFromRegs(gpu, stage); | 323 | ubo.SetFromRegs(gpu, stage); |
| 324 | const GLintptr offset = buffer_cache.UploadHostMemory( | 324 | const GLintptr offset = |
| 325 | &ubo, sizeof(ubo), static_cast<std::size_t>(uniform_buffer_alignment)); | 325 | buffer_cache.UploadHostMemory(&ubo, sizeof(ubo), device.GetUniformBufferAlignment()); |
| 326 | 326 | ||
| 327 | // Bind the emulation info buffer | 327 | // Bind the emulation info buffer |
| 328 | bind_ubo_pushbuffer.Push(buffer_cache.GetHandle(), offset, | 328 | bind_ubo_pushbuffer.Push(buffer_cache.GetHandle(), offset, |
| @@ -706,23 +706,24 @@ void RasterizerOpenGL::DrawArrays() { | |||
| 706 | // Add space for index buffer (keeping in mind non-core primitives) | 706 | // Add space for index buffer (keeping in mind non-core primitives) |
| 707 | switch (regs.draw.topology) { | 707 | switch (regs.draw.topology) { |
| 708 | case Maxwell::PrimitiveTopology::Quads: | 708 | case Maxwell::PrimitiveTopology::Quads: |
| 709 | buffer_size = Common::AlignUp<std::size_t>(buffer_size, 4) + | 709 | buffer_size = Common::AlignUp(buffer_size, 4) + |
| 710 | primitive_assembler.CalculateQuadSize(regs.vertex_buffer.count); | 710 | primitive_assembler.CalculateQuadSize(regs.vertex_buffer.count); |
| 711 | break; | 711 | break; |
| 712 | default: | 712 | default: |
| 713 | if (is_indexed) { | 713 | if (is_indexed) { |
| 714 | buffer_size = Common::AlignUp<std::size_t>(buffer_size, 4) + CalculateIndexBufferSize(); | 714 | buffer_size = Common::AlignUp(buffer_size, 4) + CalculateIndexBufferSize(); |
| 715 | } | 715 | } |
| 716 | break; | 716 | break; |
| 717 | } | 717 | } |
| 718 | 718 | ||
| 719 | // Uniform space for the 5 shader stages | 719 | // Uniform space for the 5 shader stages |
| 720 | buffer_size = | 720 | buffer_size = Common::AlignUp<std::size_t>(buffer_size, 4) + |
| 721 | Common::AlignUp<std::size_t>(buffer_size, 4) + | 721 | (sizeof(GLShader::MaxwellUniformData) + device.GetUniformBufferAlignment()) * |
| 722 | (sizeof(GLShader::MaxwellUniformData) + uniform_buffer_alignment) * Maxwell::MaxShaderStage; | 722 | Maxwell::MaxShaderStage; |
| 723 | 723 | ||
| 724 | // Add space for at least 18 constant buffers | 724 | // Add space for at least 18 constant buffers |
| 725 | buffer_size += Maxwell::MaxConstBuffers * (MaxConstbufferSize + uniform_buffer_alignment); | 725 | buffer_size += |
| 726 | Maxwell::MaxConstBuffers * (MaxConstbufferSize + device.GetUniformBufferAlignment()); | ||
| 726 | 727 | ||
| 727 | const bool invalidate = buffer_cache.Map(buffer_size); | 728 | const bool invalidate = buffer_cache.Map(buffer_size); |
| 728 | if (invalidate) { | 729 | if (invalidate) { |
| @@ -939,8 +940,8 @@ void RasterizerOpenGL::SetupConstBuffers(Tegra::Engines::Maxwell3D::Regs::Shader | |||
| 939 | size = Common::AlignUp(size, sizeof(GLvec4)); | 940 | size = Common::AlignUp(size, sizeof(GLvec4)); |
| 940 | ASSERT_MSG(size <= MaxConstbufferSize, "Constbuffer too big"); | 941 | ASSERT_MSG(size <= MaxConstbufferSize, "Constbuffer too big"); |
| 941 | 942 | ||
| 942 | const GLintptr const_buffer_offset = buffer_cache.UploadMemory( | 943 | const GLintptr const_buffer_offset = |
| 943 | buffer.address, size, static_cast<std::size_t>(uniform_buffer_alignment)); | 944 | buffer_cache.UploadMemory(buffer.address, size, device.GetUniformBufferAlignment()); |
| 944 | 945 | ||
| 945 | bind_ubo_pushbuffer.Push(buffer_cache.GetHandle(), const_buffer_offset, size); | 946 | bind_ubo_pushbuffer.Push(buffer_cache.GetHandle(), const_buffer_offset, size); |
| 946 | } | 947 | } |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index e4c64ae71..688ba0ad2 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include "video_core/rasterizer_cache.h" | 21 | #include "video_core/rasterizer_cache.h" |
| 22 | #include "video_core/rasterizer_interface.h" | 22 | #include "video_core/rasterizer_interface.h" |
| 23 | #include "video_core/renderer_opengl/gl_buffer_cache.h" | 23 | #include "video_core/renderer_opengl/gl_buffer_cache.h" |
| 24 | #include "video_core/renderer_opengl/gl_device.h" | ||
| 24 | #include "video_core/renderer_opengl/gl_global_cache.h" | 25 | #include "video_core/renderer_opengl/gl_global_cache.h" |
| 25 | #include "video_core/renderer_opengl/gl_primitive_assembler.h" | 26 | #include "video_core/renderer_opengl/gl_primitive_assembler.h" |
| 26 | #include "video_core/renderer_opengl/gl_rasterizer_cache.h" | 27 | #include "video_core/renderer_opengl/gl_rasterizer_cache.h" |
| @@ -213,6 +214,8 @@ private: | |||
| 213 | 214 | ||
| 214 | ScreenInfo& screen_info; | 215 | ScreenInfo& screen_info; |
| 215 | 216 | ||
| 217 | Device device; | ||
| 218 | |||
| 216 | std::unique_ptr<GLShader::ProgramManager> shader_program_manager; | 219 | std::unique_ptr<GLShader::ProgramManager> shader_program_manager; |
| 217 | std::map<std::array<Tegra::Engines::Maxwell3D::Regs::VertexAttribute, | 220 | std::map<std::array<Tegra::Engines::Maxwell3D::Regs::VertexAttribute, |
| 218 | Tegra::Engines::Maxwell3D::Regs::NumVertexAttributes>, | 221 | Tegra::Engines::Maxwell3D::Regs::NumVertexAttributes>, |
| @@ -228,7 +231,6 @@ private: | |||
| 228 | static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024; | 231 | static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024; |
| 229 | OGLBufferCache buffer_cache; | 232 | OGLBufferCache buffer_cache; |
| 230 | PrimitiveAssembler primitive_assembler{buffer_cache}; | 233 | PrimitiveAssembler primitive_assembler{buffer_cache}; |
| 231 | GLint uniform_buffer_alignment; | ||
| 232 | 234 | ||
| 233 | BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER}; | 235 | BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER}; |
| 234 | BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER}; | 236 | BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER}; |