From f707c2dac473c8971eccfd31d1b71281a039d95c Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Mar 2018 20:00:41 -0400 Subject: gl_rasterizer: Add a simple passthrough shader in lieu of shader generation. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 59 ++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 3 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 24cfff229..8b08de011 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -54,6 +54,8 @@ static void SetShaderUniformBlockBindings(GLuint shader) { } RasterizerOpenGL::RasterizerOpenGL() { + shader_dirty = true; + has_ARB_buffer_storage = false; has_ARB_direct_state_access = false; has_ARB_separate_shader_objects = false; @@ -106,8 +108,6 @@ RasterizerOpenGL::RasterizerOpenGL() { state.draw.vertex_buffer = stream_buffer->GetHandle(); pipeline.Create(); - vs_input_index_min = 0; - vs_input_index_max = 0; state.draw.program_pipeline = pipeline.handle; state.draw.shader_program = 0; state.draw.vertex_array = hw_vao.handle; @@ -233,7 +233,60 @@ bool RasterizerOpenGL::AccelerateDisplay(const void* config, PAddr framebuffer_a } void RasterizerOpenGL::SetShader() { - UNIMPLEMENTED(); + // TODO(bunnei): The below sets up a static test shader for passing untransformed vertices to + // OpenGL for rendering. This should be removed/replaced when we start emulating Maxwell + // shaders. + + static constexpr char vertex_shader[] = R"( +#version 150 core + +in vec2 vert_position; +in vec2 vert_tex_coord; +out vec2 frag_tex_coord; + +void main() { + // Multiply input position by the rotscale part of the matrix and then manually translate by + // the last column. This is equivalent to using a full 3x3 matrix and expanding the vector + // to `vec3(vert_position.xy, 1.0)` + gl_Position = vec4(mat2(mat3x2(0.0015625f, 0.0, 0.0, -0.0027778, -1.0, 1.0)) * vert_position + mat3x2(0.0015625f, 0.0, 0.0, -0.0027778, -1.0, 1.0)[2], 0.0, 1.0); + frag_tex_coord = vert_tex_coord; +} +)"; + + static constexpr char fragment_shader[] = R"( +#version 150 core + +in vec2 frag_tex_coord; +out vec4 color; + +uniform sampler2D color_texture; + +void main() { + color = vec4(1.0, 0.0, 0.0, 1.0); +} +)"; + + if (current_shader) { + return; + } + + LOG_ERROR(HW_GPU, "Emulated shaders are not supported! Using a passthrough shader."); + + current_shader = &test_shader; + if (has_ARB_separate_shader_objects) { + test_shader.shader.Create(vertex_shader, nullptr, fragment_shader, {}, true); + glActiveShaderProgram(pipeline.handle, test_shader.shader.handle); + } else { + ASSERT_MSG(false, "Unimplemented"); + } + + state.draw.shader_program = test_shader.shader.handle; + state.Apply(); + + if (has_ARB_separate_shader_objects) { + state.draw.shader_program = 0; + state.Apply(); + } } void RasterizerOpenGL::SyncClipEnabled() { -- cgit v1.2.3 From c6362543d46de63d276874e79715f05dcdfea8e5 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Mar 2018 20:19:34 -0400 Subject: gl_rasterizer: Replace a bunch of UNIMPLEMENTED with ASSERT. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 8b08de011..0aed4b048 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -120,7 +120,7 @@ RasterizerOpenGL::RasterizerOpenGL() { glBufferData(GL_UNIFORM_BUFFER, sizeof(VSUniformData), nullptr, GL_STREAM_COPY); glBindBufferBase(GL_UNIFORM_BUFFER, 1, vs_uniform_buffer.handle); } else { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } accelerate_draw = AccelDraw::Disabled; @@ -167,12 +167,12 @@ void RasterizerOpenGL::SetupVertexShader(VSUniformData* ub_ptr, GLintptr buffer_ void RasterizerOpenGL::SetupFragmentShader(FSUniformData* ub_ptr, GLintptr buffer_offset) { MICROPROFILE_SCOPE(OpenGL_FS); - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } bool RasterizerOpenGL::AccelerateDrawBatch(bool is_indexed) { if (!has_ARB_separate_shader_objects) { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); return false; } @@ -212,23 +212,23 @@ void RasterizerOpenGL::FlushAndInvalidateRegion(PAddr addr, u32 size) { bool RasterizerOpenGL::AccelerateDisplayTransfer(const void* config) { MICROPROFILE_SCOPE(OpenGL_Blits); - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); return true; } bool RasterizerOpenGL::AccelerateTextureCopy(const void* config) { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); return true; } bool RasterizerOpenGL::AccelerateFill(const void* config) { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); return true; } bool RasterizerOpenGL::AccelerateDisplay(const void* config, PAddr framebuffer_addr, u32 pixel_stride, ScreenInfo& screen_info) { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); return true; } @@ -290,33 +290,33 @@ void main() { } void RasterizerOpenGL::SyncClipEnabled() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncClipCoef() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncCullMode() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncDepthScale() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncDepthOffset() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncBlendEnabled() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncBlendFuncs() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } void RasterizerOpenGL::SyncBlendColor() { - UNIMPLEMENTED(); + ASSERT_MSG(false, "Unimplemented"); } -- cgit v1.2.3 From bfe45774f16e958bf34ed0d58a1d31e2325df47d Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Mar 2018 21:04:30 -0400 Subject: video_core: Move FramebufferInfo to FramebufferConfig in GPU. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 0aed4b048..abc6607b0 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -226,8 +226,9 @@ bool RasterizerOpenGL::AccelerateFill(const void* config) { return true; } -bool RasterizerOpenGL::AccelerateDisplay(const void* config, PAddr framebuffer_addr, - u32 pixel_stride, ScreenInfo& screen_info) { +bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& framebuffer, + PAddr framebuffer_addr, u32 pixel_stride, + ScreenInfo& screen_info) { ASSERT_MSG(false, "Unimplemented"); return true; } -- cgit v1.2.3 From 8a250de987404034a4cf1a09f244c40947b4be9b Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Mar 2018 21:13:46 -0400 Subject: video_core: Remove usage of PAddr and replace with VAddr. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index abc6607b0..20e192ec9 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -194,17 +194,17 @@ void RasterizerOpenGL::FlushAll() { res_cache.FlushAll(); } -void RasterizerOpenGL::FlushRegion(PAddr addr, u32 size) { +void RasterizerOpenGL::FlushRegion(VAddr addr, u32 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.FlushRegion(addr, size); } -void RasterizerOpenGL::InvalidateRegion(PAddr addr, u32 size) { +void RasterizerOpenGL::InvalidateRegion(VAddr addr, u32 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.InvalidateRegion(addr, size, nullptr); } -void RasterizerOpenGL::FlushAndInvalidateRegion(PAddr addr, u32 size) { +void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u32 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.FlushRegion(addr, size); res_cache.InvalidateRegion(addr, size, nullptr); @@ -227,7 +227,7 @@ bool RasterizerOpenGL::AccelerateFill(const void* config) { } bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& framebuffer, - PAddr framebuffer_addr, u32 pixel_stride, + VAddr framebuffer_addr, u32 pixel_stride, ScreenInfo& screen_info) { ASSERT_MSG(false, "Unimplemented"); return true; -- cgit v1.2.3 From a0b1235f82b2632651cb817f8216cc9af37759a2 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Mar 2018 23:06:54 -0400 Subject: gl_rasterizer: Implement AccelerateDisplay method from Citra. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 34 +++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 20e192ec9..b51614c25 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -229,7 +229,39 @@ bool RasterizerOpenGL::AccelerateFill(const void* config) { bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& framebuffer, VAddr framebuffer_addr, u32 pixel_stride, ScreenInfo& screen_info) { - ASSERT_MSG(false, "Unimplemented"); + if (framebuffer_addr == 0) { + return false; + } + MICROPROFILE_SCOPE(OpenGL_CacheManagement); + + SurfaceParams src_params; + src_params.addr = framebuffer_addr; + src_params.width = std::min(framebuffer.width, pixel_stride); + src_params.height = framebuffer.height; + src_params.stride = pixel_stride; + src_params.is_tiled = false; + src_params.pixel_format = + SurfaceParams::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format); + src_params.UpdateParams(); + + MathUtil::Rectangle src_rect; + Surface src_surface; + std::tie(src_surface, src_rect) = + res_cache.GetSurfaceSubRect(src_params, ScaleMatch::Ignore, true); + + if (src_surface == nullptr) { + return false; + } + + u32 scaled_width = src_surface->GetScaledWidth(); + u32 scaled_height = src_surface->GetScaledHeight(); + + screen_info.display_texcoords = MathUtil::Rectangle( + (float)src_rect.bottom / (float)scaled_height, (float)src_rect.left / (float)scaled_width, + (float)src_rect.top / (float)scaled_height, (float)src_rect.right / (float)scaled_width); + + screen_info.display_texture = src_surface->texture.handle; + return true; } -- cgit v1.2.3 From 11047d7fd511fd9ae6130da7bc824fefa6fb64c1 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Mar 2018 15:01:45 -0400 Subject: rasterizer: Flush and invalidate regions should be 64-bit. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index b51614c25..09828e48d 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -194,17 +194,17 @@ void RasterizerOpenGL::FlushAll() { res_cache.FlushAll(); } -void RasterizerOpenGL::FlushRegion(VAddr addr, u32 size) { +void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.FlushRegion(addr, size); } -void RasterizerOpenGL::InvalidateRegion(VAddr addr, u32 size) { +void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.InvalidateRegion(addr, size, nullptr); } -void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u32 size) { +void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size) { MICROPROFILE_SCOPE(OpenGL_CacheManagement); res_cache.FlushRegion(addr, size); res_cache.InvalidateRegion(addr, size, nullptr); -- cgit v1.2.3 From 4ed54738fc7777781213cd160cb0f4255a5c7c26 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Mar 2018 22:24:16 -0400 Subject: gl_rasterizer: Log warning instead of sync'ing unimplemented funcs. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 09828e48d..12a1ab09b 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -127,13 +127,7 @@ RasterizerOpenGL::RasterizerOpenGL() { glEnable(GL_BLEND); - // Sync fixed function OpenGL state - SyncClipEnabled(); - SyncClipCoef(); - SyncCullMode(); - SyncBlendEnabled(); - SyncBlendFuncs(); - SyncBlendColor(); + LOG_WARNING(HW_GPU, "Sync fixed function OpenGL state here when ready"); } RasterizerOpenGL::~RasterizerOpenGL() { -- cgit v1.2.3 From d561e4acc8bd3f9a7d677fe713ab0a748ff7dd9c Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Mar 2018 22:27:53 -0400 Subject: gl_rasterizer: Fake render in green, because it's cooler. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 12a1ab09b..286491b73 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -289,7 +289,7 @@ out vec4 color; uniform sampler2D color_texture; void main() { - color = vec4(1.0, 0.0, 0.0, 1.0); + color = vec4(1.0, 0.0, 1.0, 0.0); } )"; -- cgit v1.2.3