From 0520ce944813d936e61a559b6bde62b19326599b Mon Sep 17 00:00:00 2001
From: Joshua Ashton <joshua@froggi.es>
Date: Thu, 13 May 2021 01:32:40 +0100
Subject: [PATCH] [d3d9] Treat largest element in Stream 0 as vertex decl size

Closes #2059
---
 src/d3d9/d3d9_vertex_declaration.cpp | 3 +++
 src/d3d9/d3d9_vertex_declaration.h   | 9 ++++-----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/d3d9/d3d9_vertex_declaration.cpp b/src/d3d9/d3d9_vertex_declaration.cpp
index e5e89040..9eb65d79 100644
--- a/src/d3d9/d3d9_vertex_declaration.cpp
+++ b/src/d3d9/d3d9_vertex_declaration.cpp
@@ -208,6 +208,9 @@ namespace dxvk {
 
   void D3D9VertexDecl::Classify() {
     for (const auto& element : m_elements) {
+      if (element.Stream == 0 && element.Type != D3DDECLTYPE_UNUSED)
+        m_size = std::max(m_size, element.Offset + GetDecltypeSize(D3DDECLTYPE(element.Type)));
+
       if (element.Usage == D3DDECLUSAGE_COLOR && element.UsageIndex == 0)
         m_flags.set(D3D9VertexDeclFlag::HasColor0);
       else if (element.Usage == D3DDECLUSAGE_COLOR && element.UsageIndex == 1)
diff --git a/src/d3d9/d3d9_vertex_declaration.h b/src/d3d9/d3d9_vertex_declaration.h
index 25977efa..fe519f2d 100644
--- a/src/d3d9/d3d9_vertex_declaration.h
+++ b/src/d3d9/d3d9_vertex_declaration.h
@@ -51,11 +51,7 @@ namespace dxvk {
     }
 
     UINT GetSize() const {
-      if (m_elements.size() == 0)
-        return 0;
-
-      auto& end = m_elements.back();
-      return end.Offset + GetDecltypeSize(D3DDECLTYPE(end.Type));
+      return m_size;
     }
 
     bool TestFlag(D3D9VertexDeclFlag flag) const {
@@ -78,6 +74,9 @@ namespace dxvk {
 
     uint32_t                       m_texcoordMask = 0;
 
+    // The size of Stream 0. That's all we care about.
+    uint32_t                       m_size = 0;
+
   };
 
 }
\ No newline at end of file