From 5fb4c718cc831c31fb1e049aa015df7576f7e0f8 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 4 Mar 2018 19:13:15 -0500 Subject: GPU: Intercept writes to the VERTEX_END_GL register. This is the register that gets written after a game calls DrawArrays(). We should collect all GPU state and draw using our graphics API here. --- src/video_core/engines/maxwell_3d.cpp | 9 +++++++++ src/video_core/engines/maxwell_3d.h | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'src/video_core') diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 9f699399f..842c5a014 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -19,6 +19,10 @@ void Maxwell3D::WriteReg(u32 method, u32 value) { #define MAXWELL3D_REG_INDEX(field_name) (offsetof(Regs, field_name) / sizeof(u32)) switch (method) { + case MAXWELL3D_REG_INDEX(draw.vertex_end_gl): { + DrawArrays(); + break; + } case MAXWELL3D_REG_INDEX(query.query_get): { ProcessQueryGet(); break; @@ -47,5 +51,10 @@ void Maxwell3D::ProcessQueryGet() { UNIMPLEMENTED_MSG("Query mode %u not implemented", regs.query.query_get.mode.Value()); } } + +void Maxwell3D::DrawArrays() { + LOG_WARNING(HW_GPU, "Game requested a DrawArrays, ignoring"); +} + } // namespace Engines } // namespace Tegra diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 1eeef6857..93f7698a0 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -32,7 +32,12 @@ public: union { struct { - INSERT_PADDING_WORDS(0x6C0); + INSERT_PADDING_WORDS(0x585); + struct { + u32 vertex_end_gl; + u32 vertex_begin_gl; + } draw; + INSERT_PADDING_WORDS(0x139); struct { u32 query_address_high; u32 query_address_low; @@ -61,6 +66,9 @@ private: /// Handles a write to the QUERY_GET register. void ProcessQueryGet(); + /// Handles a write to the VERTEX_END_GL register, triggering a draw. + void DrawArrays(); + MemoryManager& memory_manager; }; -- cgit v1.2.3