diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 35 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 22 | 
2 files changed, 56 insertions, 1 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 3c49cd27f..869ddde90 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -229,6 +229,41 @@ public:                      BitField<21, 6, VertexSize> size;                      BitField<27, 3, VertexType> type;                      BitField<31, 1, u32> bgra; + +                    u32 SizeInBytes() const { +                        switch (size) { +                        case VertexSize::Size_32_32_32_32: +                            return 16; +                        case VertexSize::Size_32_32_32: +                            return 12; +                        case VertexSize::Size_16_16_16_16: +                            return 8; +                        case VertexSize::Size_32_32: +                            return 8; +                        case VertexSize::Size_16_16_16: +                            return 6; +                        case VertexSize::Size_8_8_8_8: +                            return 4; +                        case VertexSize::Size_16_16: +                            return 4; +                        case VertexSize::Size_32: +                            return 4; +                        case VertexSize::Size_8_8_8: +                            return 3; +                        case VertexSize::Size_8_8: +                            return 2; +                        case VertexSize::Size_16: +                            return 2; +                        case VertexSize::Size_8: +                            return 1; +                        case VertexSize::Size_10_10_10_2: +                            return 4; +                        case VertexSize::Size_11_11_10: +                            return 4; +                        default: +                            UNREACHABLE(); +                        } +                    }                  } vertex_attrib_format[NumVertexAttributes];                  INSERT_PADDING_WORDS(0xF); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 286491b73..982e84768 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -14,7 +14,10 @@  #include "common/microprofile.h"  #include "common/scope_exit.h"  #include "common/vector_math.h" +#include "core/core.h" +#include "core/hle/kernel/process.h"  #include "core/settings.h" +#include "video_core/engines/maxwell_3d.h"  #include "video_core/renderer_opengl/gl_rasterizer.h"  #include "video_core/renderer_opengl/gl_shader_gen.h"  #include "video_core/renderer_opengl/renderer_opengl.h" @@ -146,7 +149,24 @@ static constexpr std::array<GLenum, 4> vs_attrib_types{  };  void RasterizerOpenGL::AnalyzeVertexArray(bool is_indexed) { -    UNIMPLEMENTED(); +    const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs; +    const auto& vertex_attributes = regs.vertex_attrib_format; + +    if (is_indexed) { +        UNREACHABLE(); +    } +    const u32 vertex_num = regs.vertex_buffer.count; + +    vs_input_size = 0; +    u32 max_offset{}; +    for (const auto& attrib : vertex_attributes) { +        if (max_offset >= attrib.offset) { +            continue; +        } +        max_offset = attrib.offset; +        vs_input_size = max_offset + attrib.SizeInBytes(); +    } +    vs_input_size *= vertex_num;  }  void RasterizerOpenGL::SetupVertexArray(u8* array_ptr, GLintptr buffer_offset) {  | 
