diff options
| author | 2020-03-02 01:54:00 -0300 | |
|---|---|---|
| committer | 2020-03-09 18:40:53 -0300 | |
| commit | eb5861e0a22851cd2b2ca38136bfc7870790836e (patch) | |
| tree | 2af932e6d3d4b7992b342576788fbab62cf94a36 /src/video_core/engines | |
| parent | shader/registry: Address feedback (diff) | |
| download | yuzu-eb5861e0a22851cd2b2ca38136bfc7870790836e.tar.gz yuzu-eb5861e0a22851cd2b2ca38136bfc7870790836e.tar.xz yuzu-eb5861e0a22851cd2b2ca38136bfc7870790836e.zip | |
engines/maxwell_3d: Add TFB registers and store them in shader registry
Diffstat (limited to 'src/video_core/engines')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 491cff370..7000b0589 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -67,6 +67,7 @@ public: | |||
| 67 | static constexpr std::size_t NumVaryings = 31; | 67 | static constexpr std::size_t NumVaryings = 31; |
| 68 | static constexpr std::size_t NumImages = 8; // TODO(Rodrigo): Investigate this number | 68 | static constexpr std::size_t NumImages = 8; // TODO(Rodrigo): Investigate this number |
| 69 | static constexpr std::size_t NumClipDistances = 8; | 69 | static constexpr std::size_t NumClipDistances = 8; |
| 70 | static constexpr std::size_t NumTransformFeedbackBuffers = 4; | ||
| 70 | static constexpr std::size_t MaxShaderProgram = 6; | 71 | static constexpr std::size_t MaxShaderProgram = 6; |
| 71 | static constexpr std::size_t MaxShaderStage = 5; | 72 | static constexpr std::size_t MaxShaderStage = 5; |
| 72 | // Maximum number of const buffers per shader stage. | 73 | // Maximum number of const buffers per shader stage. |
| @@ -621,6 +622,22 @@ public: | |||
| 621 | float depth_range_far; | 622 | float depth_range_far; |
| 622 | }; | 623 | }; |
| 623 | 624 | ||
| 625 | struct alignas(32) TransformFeedbackBinding { | ||
| 626 | u32 buffer_enable; | ||
| 627 | u32 address_high; | ||
| 628 | u32 address_low; | ||
| 629 | s32 buffer_size; | ||
| 630 | s32 buffer_offset; | ||
| 631 | }; | ||
| 632 | static_assert(sizeof(TransformFeedbackBinding) == 32); | ||
| 633 | |||
| 634 | struct alignas(16) TransformFeedbackLayout { | ||
| 635 | u32 stream; | ||
| 636 | u32 varying_count; | ||
| 637 | u32 stride; | ||
| 638 | }; | ||
| 639 | static_assert(sizeof(TransformFeedbackLayout) == 16); | ||
| 640 | |||
| 624 | bool IsShaderConfigEnabled(std::size_t index) const { | 641 | bool IsShaderConfigEnabled(std::size_t index) const { |
| 625 | // The VertexB is always enabled. | 642 | // The VertexB is always enabled. |
| 626 | if (index == static_cast<std::size_t>(Regs::ShaderProgram::VertexB)) { | 643 | if (index == static_cast<std::size_t>(Regs::ShaderProgram::VertexB)) { |
| @@ -677,7 +694,13 @@ public: | |||
| 677 | 694 | ||
| 678 | u32 rasterize_enable; | 695 | u32 rasterize_enable; |
| 679 | 696 | ||
| 680 | INSERT_UNION_PADDING_WORDS(0xF1); | 697 | std::array<TransformFeedbackBinding, NumTransformFeedbackBuffers> tfb_bindings; |
| 698 | |||
| 699 | INSERT_UNION_PADDING_WORDS(0xC0); | ||
| 700 | |||
| 701 | std::array<TransformFeedbackLayout, NumTransformFeedbackBuffers> tfb_layouts; | ||
| 702 | |||
| 703 | INSERT_UNION_PADDING_WORDS(0x1); | ||
| 681 | 704 | ||
| 682 | u32 tfb_enabled; | 705 | u32 tfb_enabled; |
| 683 | 706 | ||
| @@ -1187,7 +1210,11 @@ public: | |||
| 1187 | 1210 | ||
| 1188 | u32 tex_cb_index; | 1211 | u32 tex_cb_index; |
| 1189 | 1212 | ||
| 1190 | INSERT_UNION_PADDING_WORDS(0x395); | 1213 | INSERT_UNION_PADDING_WORDS(0x7D); |
| 1214 | |||
| 1215 | std::array<std::array<u8, 128>, NumTransformFeedbackBuffers> tfb_varying_locs; | ||
| 1216 | |||
| 1217 | INSERT_UNION_PADDING_WORDS(0x298); | ||
| 1191 | 1218 | ||
| 1192 | struct { | 1219 | struct { |
| 1193 | /// Compressed address of a buffer that holds information about bound SSBOs. | 1220 | /// Compressed address of a buffer that holds information about bound SSBOs. |
| @@ -1413,6 +1440,8 @@ ASSERT_REG_POSITION(tess_mode, 0xC8); | |||
| 1413 | ASSERT_REG_POSITION(tess_level_outer, 0xC9); | 1440 | ASSERT_REG_POSITION(tess_level_outer, 0xC9); |
| 1414 | ASSERT_REG_POSITION(tess_level_inner, 0xCD); | 1441 | ASSERT_REG_POSITION(tess_level_inner, 0xCD); |
| 1415 | ASSERT_REG_POSITION(rasterize_enable, 0xDF); | 1442 | ASSERT_REG_POSITION(rasterize_enable, 0xDF); |
| 1443 | ASSERT_REG_POSITION(tfb_bindings, 0xE0); | ||
| 1444 | ASSERT_REG_POSITION(tfb_layouts, 0x1C0); | ||
| 1416 | ASSERT_REG_POSITION(tfb_enabled, 0x1D1); | 1445 | ASSERT_REG_POSITION(tfb_enabled, 0x1D1); |
| 1417 | ASSERT_REG_POSITION(rt, 0x200); | 1446 | ASSERT_REG_POSITION(rt, 0x200); |
| 1418 | ASSERT_REG_POSITION(viewport_transform, 0x280); | 1447 | ASSERT_REG_POSITION(viewport_transform, 0x280); |
| @@ -1508,6 +1537,7 @@ ASSERT_REG_POSITION(firmware, 0x8C0); | |||
| 1508 | ASSERT_REG_POSITION(const_buffer, 0x8E0); | 1537 | ASSERT_REG_POSITION(const_buffer, 0x8E0); |
| 1509 | ASSERT_REG_POSITION(cb_bind[0], 0x904); | 1538 | ASSERT_REG_POSITION(cb_bind[0], 0x904); |
| 1510 | ASSERT_REG_POSITION(tex_cb_index, 0x982); | 1539 | ASSERT_REG_POSITION(tex_cb_index, 0x982); |
| 1540 | ASSERT_REG_POSITION(tfb_varying_locs, 0xA00); | ||
| 1511 | ASSERT_REG_POSITION(ssbo_info, 0xD18); | 1541 | ASSERT_REG_POSITION(ssbo_info, 0xD18); |
| 1512 | ASSERT_REG_POSITION(tex_info_buffers.address[0], 0xD2A); | 1542 | ASSERT_REG_POSITION(tex_info_buffers.address[0], 0xD2A); |
| 1513 | ASSERT_REG_POSITION(tex_info_buffers.size[0], 0xD2F); | 1543 | ASSERT_REG_POSITION(tex_info_buffers.size[0], 0xD2F); |