diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 12 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_compute.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_compute.h | 36 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 6 |
5 files changed, 92 insertions, 3 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index b81b0723d..16cdfc7e2 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -461,7 +461,11 @@ public: | |||
| 461 | u32 entry; | 461 | u32 entry; |
| 462 | } macros; | 462 | } macros; |
| 463 | 463 | ||
| 464 | INSERT_PADDING_WORDS(0x1B8); | 464 | INSERT_PADDING_WORDS(0x189); |
| 465 | |||
| 466 | u32 tfb_enabled; | ||
| 467 | |||
| 468 | INSERT_PADDING_WORDS(0x2E); | ||
| 465 | 469 | ||
| 466 | RenderTargetConfig rt[NumRenderTargets]; | 470 | RenderTargetConfig rt[NumRenderTargets]; |
| 467 | 471 | ||
| @@ -594,7 +598,9 @@ public: | |||
| 594 | 598 | ||
| 595 | u32 depth_write_enabled; | 599 | u32 depth_write_enabled; |
| 596 | 600 | ||
| 597 | INSERT_PADDING_WORDS(0x7); | 601 | u32 alpha_test_enabled; |
| 602 | |||
| 603 | INSERT_PADDING_WORDS(0x6); | ||
| 598 | 604 | ||
| 599 | u32 d3d_cull_mode; | 605 | u32 d3d_cull_mode; |
| 600 | 606 | ||
| @@ -977,6 +983,7 @@ private: | |||
| 977 | "Field " #field_name " has invalid position") | 983 | "Field " #field_name " has invalid position") |
| 978 | 984 | ||
| 979 | ASSERT_REG_POSITION(macros, 0x45); | 985 | ASSERT_REG_POSITION(macros, 0x45); |
| 986 | ASSERT_REG_POSITION(tfb_enabled, 0x1D1); | ||
| 980 | ASSERT_REG_POSITION(rt, 0x200); | 987 | ASSERT_REG_POSITION(rt, 0x200); |
| 981 | ASSERT_REG_POSITION(viewport_transform[0], 0x280); | 988 | ASSERT_REG_POSITION(viewport_transform[0], 0x280); |
| 982 | ASSERT_REG_POSITION(viewport, 0x300); | 989 | ASSERT_REG_POSITION(viewport, 0x300); |
| @@ -996,6 +1003,7 @@ ASSERT_REG_POSITION(zeta_height, 0x48b); | |||
| 996 | ASSERT_REG_POSITION(depth_test_enable, 0x4B3); | 1003 | ASSERT_REG_POSITION(depth_test_enable, 0x4B3); |
| 997 | ASSERT_REG_POSITION(independent_blend_enable, 0x4B9); | 1004 | ASSERT_REG_POSITION(independent_blend_enable, 0x4B9); |
| 998 | ASSERT_REG_POSITION(depth_write_enabled, 0x4BA); | 1005 | ASSERT_REG_POSITION(depth_write_enabled, 0x4BA); |
| 1006 | ASSERT_REG_POSITION(alpha_test_enabled, 0x4BB); | ||
| 999 | ASSERT_REG_POSITION(d3d_cull_mode, 0x4C2); | 1007 | ASSERT_REG_POSITION(d3d_cull_mode, 0x4C2); |
| 1000 | ASSERT_REG_POSITION(depth_test_func, 0x4C3); | 1008 | ASSERT_REG_POSITION(depth_test_func, 0x4C3); |
| 1001 | ASSERT_REG_POSITION(blend, 0x4CF); | 1009 | ASSERT_REG_POSITION(blend, 0x4CF); |
diff --git a/src/video_core/engines/maxwell_compute.cpp b/src/video_core/engines/maxwell_compute.cpp index e4e5f9e5e..59e28b22d 100644 --- a/src/video_core/engines/maxwell_compute.cpp +++ b/src/video_core/engines/maxwell_compute.cpp | |||
| @@ -2,12 +2,29 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/logging/log.h" | ||
| 6 | #include "core/core.h" | ||
| 5 | #include "video_core/engines/maxwell_compute.h" | 7 | #include "video_core/engines/maxwell_compute.h" |
| 6 | 8 | ||
| 7 | namespace Tegra { | 9 | namespace Tegra { |
| 8 | namespace Engines { | 10 | namespace Engines { |
| 9 | 11 | ||
| 10 | void MaxwellCompute::WriteReg(u32 method, u32 value) {} | 12 | void MaxwellCompute::WriteReg(u32 method, u32 value) { |
| 13 | ASSERT_MSG(method < Regs::NUM_REGS, | ||
| 14 | "Invalid MaxwellCompute register, increase the size of the Regs structure"); | ||
| 15 | |||
| 16 | regs.reg_array[method] = value; | ||
| 17 | |||
| 18 | switch (method) { | ||
| 19 | case MAXWELL_COMPUTE_REG_INDEX(compute): { | ||
| 20 | LOG_CRITICAL(HW_GPU, "Compute shaders are not implemented"); | ||
| 21 | UNREACHABLE(); | ||
| 22 | break; | ||
| 23 | } | ||
| 24 | default: | ||
| 25 | break; | ||
| 26 | } | ||
| 27 | } | ||
| 11 | 28 | ||
| 12 | } // namespace Engines | 29 | } // namespace Engines |
| 13 | } // namespace Tegra | 30 | } // namespace Tegra |
diff --git a/src/video_core/engines/maxwell_compute.h b/src/video_core/engines/maxwell_compute.h index 2b3e4ced6..6ea934fb9 100644 --- a/src/video_core/engines/maxwell_compute.h +++ b/src/video_core/engines/maxwell_compute.h | |||
| @@ -4,17 +4,53 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <array> | ||
| 8 | #include "common/assert.h" | ||
| 9 | #include "common/bit_field.h" | ||
| 10 | #include "common/common_funcs.h" | ||
| 7 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 8 | 12 | ||
| 9 | namespace Tegra::Engines { | 13 | namespace Tegra::Engines { |
| 10 | 14 | ||
| 15 | #define MAXWELL_COMPUTE_REG_INDEX(field_name) \ | ||
| 16 | (offsetof(Tegra::Engines::MaxwellCompute::Regs, field_name) / sizeof(u32)) | ||
| 17 | |||
| 11 | class MaxwellCompute final { | 18 | class MaxwellCompute final { |
| 12 | public: | 19 | public: |
| 13 | MaxwellCompute() = default; | 20 | MaxwellCompute() = default; |
| 14 | ~MaxwellCompute() = default; | 21 | ~MaxwellCompute() = default; |
| 15 | 22 | ||
| 23 | struct Regs { | ||
| 24 | static constexpr std::size_t NUM_REGS = 0xCF8; | ||
| 25 | |||
| 26 | union { | ||
| 27 | struct { | ||
| 28 | INSERT_PADDING_WORDS(0x281); | ||
| 29 | |||
| 30 | union { | ||
| 31 | u32 compute_end; | ||
| 32 | BitField<0, 1, u32> unknown; | ||
| 33 | } compute; | ||
| 34 | |||
| 35 | INSERT_PADDING_WORDS(0xA76); | ||
| 36 | }; | ||
| 37 | std::array<u32, NUM_REGS> reg_array; | ||
| 38 | }; | ||
| 39 | } regs{}; | ||
| 40 | |||
| 41 | static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), | ||
| 42 | "MaxwellCompute Regs has wrong size"); | ||
| 43 | |||
| 16 | /// Write the value to the register identified by method. | 44 | /// Write the value to the register identified by method. |
| 17 | void WriteReg(u32 method, u32 value); | 45 | void WriteReg(u32 method, u32 value); |
| 18 | }; | 46 | }; |
| 19 | 47 | ||
| 48 | #define ASSERT_REG_POSITION(field_name, position) \ | ||
| 49 | static_assert(offsetof(MaxwellCompute::Regs, field_name) == position * 4, \ | ||
| 50 | "Field " #field_name " has invalid position") | ||
| 51 | |||
| 52 | ASSERT_REG_POSITION(compute, 0x281); | ||
| 53 | |||
| 54 | #undef ASSERT_REG_POSITION | ||
| 55 | |||
| 20 | } // namespace Tegra::Engines | 56 | } // namespace Tegra::Engines |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 70fb54507..44850d193 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -450,6 +450,8 @@ void RasterizerOpenGL::DrawArrays() { | |||
| 450 | SyncBlendState(); | 450 | SyncBlendState(); |
| 451 | SyncLogicOpState(); | 451 | SyncLogicOpState(); |
| 452 | SyncCullMode(); | 452 | SyncCullMode(); |
| 453 | SyncAlphaTest(); | ||
| 454 | SyncTransformFeedback(); | ||
| 453 | 455 | ||
| 454 | // TODO(bunnei): Sync framebuffer_scale uniform here | 456 | // TODO(bunnei): Sync framebuffer_scale uniform here |
| 455 | // TODO(bunnei): Sync scissorbox uniform(s) here | 457 | // TODO(bunnei): Sync scissorbox uniform(s) here |
| @@ -883,4 +885,24 @@ void RasterizerOpenGL::SyncLogicOpState() { | |||
| 883 | state.logic_op.operation = MaxwellToGL::LogicOp(regs.logic_op.operation); | 885 | state.logic_op.operation = MaxwellToGL::LogicOp(regs.logic_op.operation); |
| 884 | } | 886 | } |
| 885 | 887 | ||
| 888 | void RasterizerOpenGL::SyncAlphaTest() { | ||
| 889 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; | ||
| 890 | |||
| 891 | // TODO(Rodrigo): Alpha testing is a legacy OpenGL feature, but it can be | ||
| 892 | // implemented with a test+discard in fragment shaders. | ||
| 893 | if (regs.alpha_test_enabled != 0) { | ||
| 894 | LOG_CRITICAL(Render_OpenGL, "Alpha testing is not implemented"); | ||
| 895 | UNREACHABLE(); | ||
| 896 | } | ||
| 897 | } | ||
| 898 | |||
| 899 | void RasterizerOpenGL::SyncTransformFeedback() { | ||
| 900 | const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; | ||
| 901 | |||
| 902 | if (regs.tfb_enabled != 0) { | ||
| 903 | LOG_CRITICAL(Render_OpenGL, "Transform feedbacks are not implemented"); | ||
| 904 | UNREACHABLE(); | ||
| 905 | } | ||
| 906 | } | ||
| 907 | |||
| 886 | } // namespace OpenGL | 908 | } // namespace OpenGL |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index bf9560bdc..c3f1e14bf 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -158,6 +158,12 @@ private: | |||
| 158 | /// Syncs the LogicOp state to match the guest state | 158 | /// Syncs the LogicOp state to match the guest state |
| 159 | void SyncLogicOpState(); | 159 | void SyncLogicOpState(); |
| 160 | 160 | ||
| 161 | /// Syncs the alpha test state to match the guest state | ||
| 162 | void SyncAlphaTest(); | ||
| 163 | |||
| 164 | /// Syncs the transform feedback state to match the guest state | ||
| 165 | void SyncTransformFeedback(); | ||
| 166 | |||
| 161 | bool has_ARB_direct_state_access = false; | 167 | bool has_ARB_direct_state_access = false; |
| 162 | bool has_ARB_multi_bind = false; | 168 | bool has_ARB_multi_bind = false; |
| 163 | bool has_ARB_separate_shader_objects = false; | 169 | bool has_ARB_separate_shader_objects = false; |