- Rename VertexShaderInfo to VertexDeclaration

- Move declaration related fields to CxbxVertexShader.Declaration
This commit is contained in:
Anthony Miles 2020-04-25 22:54:24 +12:00
parent 57a8dc6f3b
commit eaa095e8a2
6 changed files with 64 additions and 69 deletions

View File

@ -1000,16 +1000,16 @@ void SetCxbxVertexShader(CxbxVertexShader* pCxbxVertexShader) {
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexShader");
// Set either FVF or the vertex declaration
if (pCxbxVertexShader->HostFVF)
if (pCxbxVertexShader->Declaration.HostFVF)
{
// Set the FVF
hRet = g_pD3DDevice->SetFVF(pCxbxVertexShader->HostFVF);
hRet = g_pD3DDevice->SetFVF(pCxbxVertexShader->Declaration.HostFVF);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetFVF");
}
else
{
// Set vertex declaration
hRet = g_pD3DDevice->SetVertexDeclaration(pCxbxVertexShader->pHostVertexDeclaration);
hRet = g_pD3DDevice->SetVertexDeclaration(pCxbxVertexShader->Declaration.pHostVertexDeclaration);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexDeclaration");
}
@ -1020,7 +1020,7 @@ void SetCxbxVertexShader(CxbxVertexShader* pCxbxVertexShader) {
// Any register not in the vertex declaration should be set to the default value
float vertexDefaultFlags[16];
for (int i = 0; i < 16; i++) {
vertexDefaultFlags[i] = pCxbxVertexShader->VertexShaderInfo.vRegisterInDeclaration[i] ? 0.0f : 1.0f;
vertexDefaultFlags[i] = pCxbxVertexShader->Declaration.vRegisterInDeclaration[i] ? 0.0f : 1.0f;
}
g_pD3DDevice->SetVertexShaderConstantF(CXBX_D3DVS_CONSTREG_VREGDEFAULTS_FLAG_BASE, vertexDefaultFlags, 4);
}
@ -4214,10 +4214,10 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader)
pRecompiledDeclaration = EmuRecompileVshDeclaration((DWORD*)pDeclaration,
/*bIsFixedFunction=*/pFunction == xbnullptr,
&XboxDeclarationCount,
&pCxbxVertexShader->VertexShaderInfo);
&pCxbxVertexShader->Declaration);
// Create the vertex declaration
hRet = g_pD3DDevice->CreateVertexDeclaration(pRecompiledDeclaration, &pCxbxVertexShader->pHostVertexDeclaration);
hRet = g_pD3DDevice->CreateVertexDeclaration(pRecompiledDeclaration, &pCxbxVertexShader->Declaration.pHostVertexDeclaration);
free(pRecompiledDeclaration);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->CreateVertexDeclaration");
@ -4226,8 +4226,11 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader)
// NOTE: This is a fatal error because it ALWAYS triggers a crash within DrawVertices if not set
CxbxKrnlCleanup("Failed to create Vertex Declaration");
}
g_pD3DDevice->SetVertexDeclaration(pCxbxVertexShader->pHostVertexDeclaration);
hRet = g_pD3DDevice->SetVertexDeclaration(pCxbxVertexShader->Declaration.pHostVertexDeclaration);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexDeclaration");
if (FAILED(hRet)) {
CxbxKrnlCleanup("Failed to set Vertex Declaration");
}
uint64_t vertexShaderKey = 0;
DWORD XboxFunctionSize = 0;
@ -4236,31 +4239,23 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader)
vertexShaderKey = g_VertexShaderSource.CreateShader(pFunction, &XboxFunctionSize);
}
pCxbxVertexShader->pXboxDeclarationCopy = (DWORD*)malloc(XboxDeclarationCount * sizeof(DWORD));
memcpy(pCxbxVertexShader->pXboxDeclarationCopy, pDeclaration, XboxDeclarationCount * sizeof(DWORD));
pCxbxVertexShader->Declaration.pXboxDeclarationCopy = (DWORD*)malloc(XboxDeclarationCount * sizeof(DWORD));
memcpy(pCxbxVertexShader->Declaration.pXboxDeclarationCopy, pDeclaration, XboxDeclarationCount * sizeof(DWORD));
pCxbxVertexShader->XboxFunctionSize = 0;
pCxbxVertexShader->pXboxFunctionCopy = nullptr;
pCxbxVertexShader->XboxVertexShaderType = X_VST_NORMAL; // TODO : This can vary
pCxbxVertexShader->XboxNrAddressSlots = (XboxFunctionSize - sizeof(X_VSH_SHADER_HEADER)) / X_VSH_INSTRUCTION_SIZE_BYTES;
pCxbxVertexShader->HostFVF = 0;
pCxbxVertexShader->Declaration.HostFVF = 0;
pCxbxVertexShader->VertexShaderKey = vertexShaderKey;
pCxbxVertexShader->XboxDeclarationCount = XboxDeclarationCount;
pCxbxVertexShader->Declaration.XboxDeclarationCount = XboxDeclarationCount;
// Save the status, to remove things later
// pCxbxVertexShader->XboxStatus = hRet; // Not even used by VshHandleIsValidShader()
if(SUCCEEDED(hRet))
if(pFunction != xbnullptr)
{
if(pFunction != xbnullptr)
{
pCxbxVertexShader->XboxFunctionSize = XboxFunctionSize;
pCxbxVertexShader->pXboxFunctionCopy = (DWORD*)malloc(XboxFunctionSize);
memcpy(pCxbxVertexShader->pXboxFunctionCopy, pFunction, XboxFunctionSize);
}
}
else
{
LOG_TEST_CASE("Falling back to FVF shader");
pCxbxVertexShader->HostFVF = D3DFVF_XYZ | D3DFVF_TEX0;
pCxbxVertexShader->XboxFunctionSize = XboxFunctionSize;
pCxbxVertexShader->pXboxFunctionCopy = (DWORD*)malloc(XboxFunctionSize);
memcpy(pCxbxVertexShader->pXboxFunctionCopy, pFunction, XboxFunctionSize);
}
// Register the host Vertex Shader
@ -7944,17 +7939,17 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_DeleteVertexShader)
CxbxVertexShader *pCxbxVertexShader = GetCxbxVertexShader(Handle);
SetCxbxVertexShader(Handle, nullptr);
if (pCxbxVertexShader->pHostVertexDeclaration) {
HRESULT hRet = pCxbxVertexShader->pHostVertexDeclaration->Release();
if (pCxbxVertexShader->Declaration.pHostVertexDeclaration) {
HRESULT hRet = pCxbxVertexShader->Declaration.pHostVertexDeclaration->Release();
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->DeleteVertexShader(pHostVertexDeclaration)");
}
// Release the host vertex shader
g_VertexShaderSource.ReleaseShader(pCxbxVertexShader->VertexShaderKey);
if (pCxbxVertexShader->pXboxDeclarationCopy)
if (pCxbxVertexShader->Declaration.pXboxDeclarationCopy)
{
free(pCxbxVertexShader->pXboxDeclarationCopy);
free(pCxbxVertexShader->Declaration.pXboxDeclarationCopy);
}
if (pCxbxVertexShader->pXboxFunctionCopy)
@ -8185,7 +8180,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_LoadVertexShaderProgram)
}
// Simply retrieve the contents of the existing vertex shader program
pXboxVertexDeclaration = pCxbxVertexShader->pXboxDeclarationCopy;
pXboxVertexDeclaration = pCxbxVertexShader->Declaration.pXboxDeclarationCopy;
} else {
// This is an unusual scenario in which an FVF-based shader is being replaced with an actual shader
// But without calling CreateVertexShader: This means we need to parse the current FVF and generate
@ -8308,13 +8303,13 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_GetVertexShaderDeclaration)
if (pSizeOfData) {
CxbxVertexShader *pCxbxVertexShader = GetCxbxVertexShader(Handle);
if (pCxbxVertexShader) {
DWORD sizeOfData = pCxbxVertexShader->XboxDeclarationCount * sizeof(DWORD);
DWORD sizeOfData = pCxbxVertexShader->Declaration.XboxDeclarationCount * sizeof(DWORD);
if (*pSizeOfData < sizeOfData || !pData) {
*pSizeOfData = sizeOfData;
hRet = !pData ? D3D_OK : D3DERR_MOREDATA;
}
else {
memcpy(pData, pCxbxVertexShader->pXboxDeclarationCopy, pCxbxVertexShader->XboxDeclarationCount * sizeof(DWORD));
memcpy(pData, pCxbxVertexShader->Declaration.pXboxDeclarationCopy, pCxbxVertexShader->Declaration.XboxDeclarationCount * sizeof(DWORD));
hRet = D3D_OK;
}
}

View File

@ -180,9 +180,9 @@ DWORD CxbxGetStrideFromVertexShaderHandle(DWORD dwVertexShader)
CxbxVertexShader *pCxbxVertexShader = GetCxbxVertexShader(dwVertexShader);
if (pCxbxVertexShader) {
if (pCxbxVertexShader->VertexShaderInfo.NumberOfVertexStreams == 1) {
if (pCxbxVertexShader->Declaration.NumberOfVertexStreams == 1) {
// Note : This assumes that the only stream in use will be stream zero :
Stride = pCxbxVertexShader->VertexShaderInfo.VertexStreams[0].HostVertexStride;
Stride = pCxbxVertexShader->Declaration.VertexStreams[0].HostVertexStride;
}
else {
LOG_TEST_CASE("Non-FVF Vertex Shaders with multiple streams not supported for PushBuffer emulation!");

View File

@ -113,7 +113,7 @@ CxbxPatchedStream::~CxbxPatchedStream()
CxbxVertexBufferConverter::CxbxVertexBufferConverter()
{
m_uiNbrStreams = 0;
m_pVertexShaderInfo = nullptr;
m_pCxbxVertexDeclaration = nullptr;
}
int CountActiveD3DStreams()
@ -128,7 +128,7 @@ int CountActiveD3DStreams()
return lastStreamIndex;
}
CxbxVertexShaderInfo *GetCxbxVertexShaderInfo(DWORD XboxVertexShaderHandle); // forward
CxbxVertexDeclaration *GetCxbxVertexDeclaration(DWORD XboxVertexShaderHandle); // forward
UINT CxbxVertexBufferConverter::GetNbrStreams(CxbxDrawContext *pDrawContext)
{
@ -138,13 +138,13 @@ UINT CxbxVertexBufferConverter::GetNbrStreams(CxbxDrawContext *pDrawContext)
}
if(VshHandleIsVertexShader(g_Xbox_VertexShader_Handle)) {
CxbxVertexShaderInfo *pVertexShaderInfo = GetCxbxVertexShaderInfo(g_Xbox_VertexShader_Handle);
if (pVertexShaderInfo) {
if (pVertexShaderInfo->NumberOfVertexStreams <= X_VSH_MAX_STREAMS) {
return pVertexShaderInfo->NumberOfVertexStreams;
CxbxVertexDeclaration *pDecl = GetCxbxVertexDeclaration(g_Xbox_VertexShader_Handle);
if (pDecl) {
if (pDecl->NumberOfVertexStreams <= X_VSH_MAX_STREAMS) {
return pDecl->NumberOfVertexStreams;
}
// If we reached here, pVertexShaderInfo was set,but with invalid data
// If we reached here, pDecl was set,but with invalid data
LOG_TEST_CASE("NumberOfVertexStreams > 16");
}
@ -261,13 +261,13 @@ void CxbxVertexBufferConverter::ConvertStream
}
CxbxVertexShaderStreamInfo *pVertexShaderStreamInfo = nullptr;
if (m_pVertexShaderInfo != nullptr) {
if (uiStream > m_pVertexShaderInfo->NumberOfVertexStreams + 1) {
if (m_pCxbxVertexDeclaration != nullptr) {
if (uiStream > m_pCxbxVertexDeclaration->NumberOfVertexStreams + 1) {
LOG_TEST_CASE("uiStream > NumberOfVertexStreams");
return;
}
pVertexShaderStreamInfo = &(m_pVertexShaderInfo->VertexStreams[uiStream]);
pVertexShaderStreamInfo = &(m_pCxbxVertexDeclaration->VertexStreams[uiStream]);
}
bool bNeedVertexPatching = (pVertexShaderStreamInfo != nullptr && pVertexShaderStreamInfo->NeedPatch);
@ -759,9 +759,9 @@ void CxbxVertexBufferConverter::Apply(CxbxDrawContext *pDrawContext)
if ((pDrawContext->XboxPrimitiveType < XTL::X_D3DPT_POINTLIST) || (pDrawContext->XboxPrimitiveType > XTL::X_D3DPT_POLYGON))
CxbxKrnlCleanup("Unknown primitive type: 0x%.02X\n", pDrawContext->XboxPrimitiveType);
m_pVertexShaderInfo = nullptr;
m_pCxbxVertexDeclaration = nullptr;
if (VshHandleIsVertexShader(g_Xbox_VertexShader_Handle)) {
m_pVertexShaderInfo = &(GetCxbxVertexShader(g_Xbox_VertexShader_Handle)->VertexShaderInfo);
m_pCxbxVertexDeclaration = &(GetCxbxVertexShader(g_Xbox_VertexShader_Handle)->Declaration);
}
// If we are drawing from an offset, we know that the vertex count must have

View File

@ -30,7 +30,7 @@
#include "Cxbx.h"
#include "core\hle\D3D8\XbVertexShader.h" // for CxbxVertexShaderInfo
#include "core\hle\D3D8\XbVertexShader.h"
typedef struct _CxbxDrawContext
{
@ -90,7 +90,7 @@ class CxbxVertexBufferConverter
std::list<CxbxPatchedStream> m_PatchedStreamUsageList; // Linked list of vertex streams, least recently used is last in the list
CxbxPatchedStream& GetPatchedStream(uint64_t); // Fetches (or inserts) a patched stream associated with the given key
CxbxVertexShaderInfo *m_pVertexShaderInfo;
CxbxVertexDeclaration *m_pCxbxVertexDeclaration;
// Returns the number of streams of a patch
UINT GetNbrStreams(CxbxDrawContext *pPatchDesc);

View File

@ -338,7 +338,7 @@ class XboxVertexDeclarationConverter
{
protected:
// Internal variables
CxbxVertexShaderInfo* pVertexShaderInfoToSet;
CxbxVertexDeclaration* pVertexDeclarationToSet;
CxbxVertexShaderStreamInfo* pCurrentVertexShaderStreamInfo = nullptr;
bool IsFixedFunction;
D3DVERTEXELEMENT* pRecompiled;
@ -739,7 +739,7 @@ private:
DWORD StreamNumber = VshGetVertexStream(*pXboxToken);
// new stream
pCurrentVertexShaderStreamInfo = &(pVertexShaderInfoToSet->VertexStreams[StreamNumber]);
pCurrentVertexShaderStreamInfo = &(pVertexDeclarationToSet->VertexStreams[StreamNumber]);
pCurrentVertexShaderStreamInfo->NeedPatch = FALSE;
pCurrentVertexShaderStreamInfo->DeclPosition = FALSE;
pCurrentVertexShaderStreamInfo->CurrentStreamNumber = 0;
@ -749,7 +749,7 @@ private:
// Dxbx note : Use Dophin(s), FieldRender, MatrixPaletteSkinning and PersistDisplay as a testcase
pCurrentVertexShaderStreamInfo->CurrentStreamNumber = VshGetVertexStream(*pXboxToken);
pVertexShaderInfoToSet->NumberOfVertexStreams++;
pVertexDeclarationToSet->NumberOfVertexStreams++;
// TODO : Keep a bitmask for all StreamNumber's seen?
}
}
@ -1129,12 +1129,12 @@ private:
}
public:
D3DVERTEXELEMENT *Convert(DWORD* pXboxDeclaration, bool bIsFixedFunction, CxbxVertexShaderInfo* pCxbxVertexShaderInfo)
D3DVERTEXELEMENT *Convert(DWORD* pXboxDeclaration, bool bIsFixedFunction, CxbxVertexDeclaration* pCxbxVertexDeclaration)
{
// Get a preprocessed copy of the original Xbox Vertex Declaration
auto pXboxVertexDeclarationCopy = RemoveXboxDeclarationRedefinition(pXboxDeclaration);
pVertexShaderInfoToSet = pCxbxVertexShaderInfo;
pVertexDeclarationToSet = pCxbxVertexDeclaration;
IsFixedFunction = bIsFixedFunction;
@ -1184,7 +1184,7 @@ public:
// Record which registers are in the vertex declaration
for (size_t i = 0; i < RegVIsPresentInDeclaration.size(); i++) {
pCxbxVertexShaderInfo->vRegisterInDeclaration[i] = RegVIsPresentInDeclaration[i];
pCxbxVertexDeclaration->vRegisterInDeclaration[i] = RegVIsPresentInDeclaration[i];
}
return Result;
@ -1196,12 +1196,12 @@ D3DVERTEXELEMENT *EmuRecompileVshDeclaration
DWORD *pXboxDeclaration,
bool bIsFixedFunction,
DWORD *pXboxDeclarationCount,
CxbxVertexShaderInfo *pCxbxVertexShaderInfo
CxbxVertexDeclaration *pCxbxVertexDeclaration
)
{
XboxVertexDeclarationConverter Converter;
D3DVERTEXELEMENT* pHostVertexElements = Converter.Convert(pXboxDeclaration, bIsFixedFunction, pCxbxVertexShaderInfo);
D3DVERTEXELEMENT* pHostVertexElements = Converter.Convert(pXboxDeclaration, bIsFixedFunction, pCxbxVertexDeclaration);
*pXboxDeclarationCount = Converter.XboxDeclarationCount;
@ -1210,7 +1210,7 @@ D3DVERTEXELEMENT *EmuRecompileVshDeclaration
extern void FreeVertexDynamicPatch(CxbxVertexShader *pVertexShader)
{
pVertexShader->VertexShaderInfo.NumberOfVertexStreams = 0;
pVertexShader->Declaration.NumberOfVertexStreams = 0;
}
// Checks for failed vertex shaders, and shaders that would need patching
@ -1248,15 +1248,15 @@ extern boolean IsValidCurrentShader(void)
return VshHandleIsValidShader(g_Xbox_VertexShader_Handle);
}
CxbxVertexShaderInfo *GetCxbxVertexShaderInfo(DWORD XboxVertexShaderHandle)
CxbxVertexDeclaration *GetCxbxVertexDeclaration(DWORD XboxVertexShaderHandle)
{
CxbxVertexShader *pCxbxVertexShader = GetCxbxVertexShader(XboxVertexShaderHandle);
for (uint32_t i = 0; i < pCxbxVertexShader->VertexShaderInfo.NumberOfVertexStreams; i++)
for (uint32_t i = 0; i < pCxbxVertexShader->Declaration.NumberOfVertexStreams; i++)
{
if (pCxbxVertexShader->VertexShaderInfo.VertexStreams[i].NeedPatch)
if (pCxbxVertexShader->Declaration.VertexStreams[i].NeedPatch)
{
return &pCxbxVertexShader->VertexShaderInfo;
return &pCxbxVertexShader->Declaration;
}
}
return nullptr;

View File

@ -68,21 +68,23 @@ typedef struct _CxbxVertexShaderStreamInfo
}
CxbxVertexShaderStreamInfo;
typedef struct _CxbxVertexShaderInfo
typedef struct _CxbxVertexDeclaration
{
UINT NumberOfVertexStreams; // The number of streams the vertex shader uses
CxbxVertexShaderStreamInfo VertexStreams[X_VSH_MAX_STREAMS];
bool vRegisterInDeclaration[16];
IDirect3DVertexDeclaration* pHostVertexDeclaration;
DWORD* pXboxDeclarationCopy;
DWORD XboxDeclarationCount; // Xbox's number of DWORD-sized X_D3DVSD* tokens
DWORD HostFVF; // Flexible Vertex Format (used when there's no host vertex shader)
UINT NumberOfVertexStreams; // The number of streams the vertex shader uses
bool vRegisterInDeclaration[X_VSH_MAX_ATTRIBUTES];
}
CxbxVertexShaderInfo;
CxbxVertexDeclaration;
typedef struct _CxbxVertexShader
{
// These are the parameters given by the XBE,
// we save them to be able to return them when necessary.
DWORD* pXboxDeclarationCopy;
DWORD XboxDeclarationCount; // Xbox's number of DWORD-sized X_D3DVSD* tokens
DWORD XboxFunctionSize;
DWORD* pXboxFunctionCopy;
UINT XboxNrAddressSlots;
@ -90,12 +92,10 @@ typedef struct _CxbxVertexShader
// DWORD XboxStatus; // Used by VshHandleIsValidShader()
// The resulting host variables
DWORD HostFVF; // Flexible Vertex Format (used when there's no host vertex shader)
uint64_t VertexShaderKey; // if nullptr, use SetFVF(HostFVF);
IDirect3DVertexDeclaration* pHostVertexDeclaration;
// Needed for dynamic stream patching
CxbxVertexShaderInfo VertexShaderInfo;
CxbxVertexDeclaration Declaration;
}
CxbxVertexShader;
@ -105,7 +105,7 @@ extern D3DVERTEXELEMENT *EmuRecompileVshDeclaration
DWORD *pXboxDeclaration,
bool bIsFixedFunction,
DWORD *pXboxDeclarationCount,
CxbxVertexShaderInfo *pCxbxVertexShaderInfo
CxbxVertexDeclaration *pCxbxVertexDeclaration
);
// Intermediate vertex shader structures