From 434fba0e86de09188488b25221753de81f9557ac Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 11 Mar 2023 09:02:01 -0600 Subject: [PATCH] feat(gx): handle shader render state in d3d backend --- src/gx/d3d/CGxDeviceD3d.cpp | 45 +++++++++++++++++++++++++++++++++++++ src/gx/d3d/CGxDeviceD3d.hpp | 2 ++ 2 files changed, 47 insertions(+) diff --git a/src/gx/d3d/CGxDeviceD3d.cpp b/src/gx/d3d/CGxDeviceD3d.cpp index b786dd0..a7f3945 100644 --- a/src/gx/d3d/CGxDeviceD3d.cpp +++ b/src/gx/d3d/CGxDeviceD3d.cpp @@ -745,6 +745,20 @@ void CGxDeviceD3d::IRsSendToHw(EGxRenderState which) { break; } + case GxRs_VertexShader: { + auto shader = static_cast(static_cast(state->m_value)); + this->IShaderBindVertex(shader); + + break; + } + + case GxRs_PixelShader: { + auto shader = static_cast(static_cast(state->m_value)); + this->IShaderBindPixel(shader); + + break; + } + default: break; } @@ -1000,6 +1014,37 @@ void CGxDeviceD3d::ISetVertexBuffer(uint32_t stream, LPDIRECT3DVERTEXBUFFER9 buf } } +void CGxDeviceD3d::IShaderBindPixel(CGxShader* shader) { + if (!shader) { + this->m_d3dDevice->SetPixelShader(nullptr); + + // TODO FFP handling + + return; + } + + if (!shader->loaded) { + this->IShaderCreatePixel(shader); + } + + auto d3dShader = static_cast(shader->apiSpecific); + this->m_d3dDevice->SetPixelShader(d3dShader); +} + +void CGxDeviceD3d::IShaderBindVertex(CGxShader* shader) { + if (!shader) { + this->m_d3dDevice->SetVertexShader(nullptr); + return; + } + + if (!shader->loaded) { + this->IShaderCreateVertex(shader); + } + + auto d3dShader = static_cast(shader->apiSpecific); + this->m_d3dDevice->SetVertexShader(d3dShader); +} + void CGxDeviceD3d::IShaderConstantsFlush() { // TODO } diff --git a/src/gx/d3d/CGxDeviceD3d.hpp b/src/gx/d3d/CGxDeviceD3d.hpp index f7a205e..db42733 100644 --- a/src/gx/d3d/CGxDeviceD3d.hpp +++ b/src/gx/d3d/CGxDeviceD3d.hpp @@ -270,6 +270,8 @@ class CGxDeviceD3d : public CGxDevice { void ISetCaps(const CGxFormat& format); void ISetTexture(uint32_t tmu, CGxTex* texId); void ISetVertexBuffer(uint32_t stream, LPDIRECT3DVERTEXBUFFER9 buffer, uint32_t offset, uint32_t stride); + void IShaderBindPixel(CGxShader* shader); + void IShaderBindVertex(CGxShader* shader); void IShaderConstantsFlush(); void IShaderCreatePixel(CGxShader* shader); void IShaderCreateVertex(CGxShader* shader);