summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/CMakeLists.txt2
-rw-r--r--src/video_core/renderer_opengl/gl_primitive_assembler.cpp63
-rw-r--r--src/video_core/renderer_opengl/gl_primitive_assembler.h31
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp37
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h2
-rw-r--r--src/video_core/renderer_opengl/maxwell_to_gl.h2
6 files changed, 5 insertions, 132 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 1e010e4da..0b9b6edee 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -42,8 +42,6 @@ add_library(video_core STATIC
42 renderer_opengl/gl_device.h 42 renderer_opengl/gl_device.h
43 renderer_opengl/gl_global_cache.cpp 43 renderer_opengl/gl_global_cache.cpp
44 renderer_opengl/gl_global_cache.h 44 renderer_opengl/gl_global_cache.h
45 renderer_opengl/gl_primitive_assembler.cpp
46 renderer_opengl/gl_primitive_assembler.h
47 renderer_opengl/gl_rasterizer.cpp 45 renderer_opengl/gl_rasterizer.cpp
48 renderer_opengl/gl_rasterizer.h 46 renderer_opengl/gl_rasterizer.h
49 renderer_opengl/gl_rasterizer_cache.cpp 47 renderer_opengl/gl_rasterizer_cache.cpp
diff --git a/src/video_core/renderer_opengl/gl_primitive_assembler.cpp b/src/video_core/renderer_opengl/gl_primitive_assembler.cpp
deleted file mode 100644
index c3e94d917..000000000
--- a/src/video_core/renderer_opengl/gl_primitive_assembler.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
1// Copyright 2018 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <algorithm>
6#include <array>
7#include "common/assert.h"
8#include "common/common_types.h"
9#include "core/core.h"
10#include "video_core/memory_manager.h"
11#include "video_core/renderer_opengl/gl_buffer_cache.h"
12#include "video_core/renderer_opengl/gl_primitive_assembler.h"
13
14namespace OpenGL {
15
16constexpr u32 TRIANGLES_PER_QUAD = 6;
17constexpr std::array<u32, TRIANGLES_PER_QUAD> QUAD_MAP = {0, 1, 2, 0, 2, 3};
18
19PrimitiveAssembler::PrimitiveAssembler(OGLBufferCache& buffer_cache) : buffer_cache(buffer_cache) {}
20
21PrimitiveAssembler::~PrimitiveAssembler() = default;
22
23std::size_t PrimitiveAssembler::CalculateQuadSize(u32 count) const {
24 ASSERT_MSG(count % 4 == 0, "Quad count is expected to be a multiple of 4");
25 return (count / 4) * TRIANGLES_PER_QUAD * sizeof(GLuint);
26}
27
28GLintptr PrimitiveAssembler::MakeQuadArray(u32 first, u32 count) {
29 const std::size_t size{CalculateQuadSize(count)};
30 auto [dst_pointer, index_offset] = buffer_cache.ReserveMemory(size);
31
32 for (u32 primitive = 0; primitive < count / 4; ++primitive) {
33 for (u32 i = 0; i < TRIANGLES_PER_QUAD; ++i) {
34 const u32 index = first + primitive * 4 + QUAD_MAP[i];
35 std::memcpy(dst_pointer, &index, sizeof(index));
36 dst_pointer += sizeof(index);
37 }
38 }
39
40 return index_offset;
41}
42
43GLintptr PrimitiveAssembler::MakeQuadIndexed(GPUVAddr gpu_addr, std::size_t index_size, u32 count) {
44 const std::size_t map_size{CalculateQuadSize(count)};
45 auto [dst_pointer, index_offset] = buffer_cache.ReserveMemory(map_size);
46
47 auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager();
48 const u8* source{memory_manager.GetPointer(gpu_addr)};
49
50 for (u32 primitive = 0; primitive < count / 4; ++primitive) {
51 for (std::size_t i = 0; i < TRIANGLES_PER_QUAD; ++i) {
52 const u32 index = primitive * 4 + QUAD_MAP[i];
53 const u8* src_offset = source + (index * index_size);
54
55 std::memcpy(dst_pointer, src_offset, index_size);
56 dst_pointer += index_size;
57 }
58 }
59
60 return index_offset;
61}
62
63} // namespace OpenGL
diff --git a/src/video_core/renderer_opengl/gl_primitive_assembler.h b/src/video_core/renderer_opengl/gl_primitive_assembler.h
deleted file mode 100644
index 4e87ce4d6..000000000
--- a/src/video_core/renderer_opengl/gl_primitive_assembler.h
+++ /dev/null
@@ -1,31 +0,0 @@
1// Copyright 2018 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 <glad/glad.h>
8
9#include "common/common_types.h"
10
11namespace OpenGL {
12
13class OGLBufferCache;
14
15class PrimitiveAssembler {
16public:
17 explicit PrimitiveAssembler(OGLBufferCache& buffer_cache);
18 ~PrimitiveAssembler();
19
20 /// Calculates the size required by MakeQuadArray and MakeQuadIndexed.
21 std::size_t CalculateQuadSize(u32 count) const;
22
23 GLintptr MakeQuadArray(u32 first, u32 count);
24
25 GLintptr MakeQuadIndexed(GPUVAddr gpu_addr, std::size_t index_size, u32 count);
26
27private:
28 OGLBufferCache& buffer_cache;
29};
30
31} // namespace OpenGL \ No newline at end of file
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index f9b6dfeea..5087d9406 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -246,29 +246,6 @@ DrawParameters RasterizerOpenGL::SetupDraw() {
246 DrawParameters params{}; 246 DrawParameters params{};
247 params.current_instance = gpu.state.current_instance; 247 params.current_instance = gpu.state.current_instance;
248 248
249 if (regs.draw.topology == Maxwell::PrimitiveTopology::Quads) {
250 MICROPROFILE_SCOPE(OpenGL_PrimitiveAssembly);
251
252 params.use_indexed = true;
253 params.primitive_mode = GL_TRIANGLES;
254
255 if (is_indexed) {
256 params.index_format = MaxwellToGL::IndexFormat(regs.index_array.format);
257 params.count = (regs.index_array.count / 4) * 6;
258 params.index_buffer_offset = primitive_assembler.MakeQuadIndexed(
259 regs.index_array.IndexStart(), regs.index_array.FormatSizeInBytes(),
260 regs.index_array.count);
261 params.base_vertex = static_cast<GLint>(regs.vb_element_base);
262 } else {
263 // MakeQuadArray always generates u32 indexes
264 params.index_format = GL_UNSIGNED_INT;
265 params.count = (regs.vertex_buffer.count / 4) * 6;
266 params.index_buffer_offset = primitive_assembler.MakeQuadArray(
267 regs.vertex_buffer.first, regs.vertex_buffer.count);
268 }
269 return params;
270 }
271
272 params.use_indexed = is_indexed; 249 params.use_indexed = is_indexed;
273 params.primitive_mode = MaxwellToGL::PrimitiveTopology(regs.draw.topology); 250 params.primitive_mode = MaxwellToGL::PrimitiveTopology(regs.draw.topology);
274 251
@@ -699,17 +676,9 @@ void RasterizerOpenGL::DrawArrays() {
699 676
700 std::size_t buffer_size = CalculateVertexArraysSize(); 677 std::size_t buffer_size = CalculateVertexArraysSize();
701 678
702 // Add space for index buffer (keeping in mind non-core primitives) 679 // Add space for index buffer
703 switch (regs.draw.topology) { 680 if (is_indexed) {
704 case Maxwell::PrimitiveTopology::Quads: 681 buffer_size = Common::AlignUp(buffer_size, 4) + CalculateIndexBufferSize();
705 buffer_size = Common::AlignUp(buffer_size, 4) +
706 primitive_assembler.CalculateQuadSize(regs.vertex_buffer.count);
707 break;
708 default:
709 if (is_indexed) {
710 buffer_size = Common::AlignUp(buffer_size, 4) + CalculateIndexBufferSize();
711 }
712 break;
713 } 682 }
714 683
715 // Uniform space for the 5 shader stages 684 // Uniform space for the 5 shader stages
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index d78094138..f2643f26f 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -23,7 +23,6 @@
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_device.h"
25#include "video_core/renderer_opengl/gl_global_cache.h" 25#include "video_core/renderer_opengl/gl_global_cache.h"
26#include "video_core/renderer_opengl/gl_primitive_assembler.h"
27#include "video_core/renderer_opengl/gl_rasterizer_cache.h" 26#include "video_core/renderer_opengl/gl_rasterizer_cache.h"
28#include "video_core/renderer_opengl/gl_resource_manager.h" 27#include "video_core/renderer_opengl/gl_resource_manager.h"
29#include "video_core/renderer_opengl/gl_sampler_cache.h" 28#include "video_core/renderer_opengl/gl_sampler_cache.h"
@@ -197,7 +196,6 @@ private:
197 196
198 static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024; 197 static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;
199 OGLBufferCache buffer_cache; 198 OGLBufferCache buffer_cache;
200 PrimitiveAssembler primitive_assembler{buffer_cache};
201 199
202 BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER}; 200 BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER};
203 BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER}; 201 BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER};
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h
index ed7b5cff0..e3cabded3 100644
--- a/src/video_core/renderer_opengl/maxwell_to_gl.h
+++ b/src/video_core/renderer_opengl/maxwell_to_gl.h
@@ -128,6 +128,8 @@ inline GLenum PrimitiveTopology(Maxwell::PrimitiveTopology topology) {
128 return GL_TRIANGLE_STRIP; 128 return GL_TRIANGLE_STRIP;
129 case Maxwell::PrimitiveTopology::TriangleFan: 129 case Maxwell::PrimitiveTopology::TriangleFan:
130 return GL_TRIANGLE_FAN; 130 return GL_TRIANGLE_FAN;
131 case Maxwell::PrimitiveTopology::Quads:
132 return GL_QUADS;
131 default: 133 default:
132 LOG_CRITICAL(Render_OpenGL, "Unimplemented topology={}", static_cast<u32>(topology)); 134 LOG_CRITICAL(Render_OpenGL, "Unimplemented topology={}", static_cast<u32>(topology));
133 UNREACHABLE(); 135 UNREACHABLE();