summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/CMakeLists.txt2
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp27
-rw-r--r--src/video_core/renderer_opengl/gl_device.h25
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp25
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h4
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
10namespace OpenGL {
11
12namespace {
13template <typename T>
14T GetInteger(GLenum pname) {
15 GLint temporary;
16 glGetIntegerv(pname, &temporary);
17 return static_cast<T>(temporary);
18}
19} // Anonymous namespace
20
21Device::Device() = default;
22
23void 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
9namespace OpenGL {
10
11class Device {
12public:
13 Device();
14
15 void Initialize();
16
17 std::size_t GetUniformBufferAlignment() const {
18 return uniform_buffer_alignment;
19 }
20
21private:
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};