From ed2134784e173e071a124c768eea5dd12be8425c Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Sat, 24 Mar 2018 02:01:03 -0400
Subject: [PATCH] gl_rasterizer: Implement AnalyzeVertexArray.

---
 src/video_core/engines/maxwell_3d.h           | 35 +++++++++++++++++++
 .../renderer_opengl/gl_rasterizer.cpp         | 22 +++++++++++-
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 3c49cd27f5..869ddde903 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 286491b739..982e847689 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) {