mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-06 20:58:37 +01:00
[d3d9] Return 0 if any vertex decl element can't be represented as fvf
This commit is contained in:
parent
7090105573
commit
4bcabe8d46
2 changed files with 46 additions and 28 deletions
|
@ -204,9 +204,10 @@ namespace dxvk {
|
||||||
std::copy(elements.begin(), elements.begin() + elemCount, m_elements.data());
|
std::copy(elements.begin(), elements.begin() + elemCount, m_elements.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD D3D9VertexDecl::MapD3DDeclToFvf(
|
bool D3D9VertexDecl::MapD3DDeclToFvf(
|
||||||
const D3DVERTEXELEMENT9& element,
|
const D3DVERTEXELEMENT9& element,
|
||||||
DWORD fvf,
|
DWORD fvf,
|
||||||
|
DWORD& outFvf,
|
||||||
DWORD& texCountPostUpdate) {
|
DWORD& texCountPostUpdate) {
|
||||||
|
|
||||||
// Mapping between a Direct3D Declaration and FVF Codes (Direct3D 9)
|
// Mapping between a Direct3D Declaration and FVF Codes (Direct3D 9)
|
||||||
|
@ -226,49 +227,60 @@ namespace dxvk {
|
||||||
// D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 1 N / A
|
// D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 1 N / A
|
||||||
// D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 1 N / A
|
// D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 1 N / A
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_POSITION && element.Type == D3DDECLTYPE_FLOAT3 && element.UsageIndex == 0)
|
|
||||||
return D3DFVF_XYZ;
|
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_POSITIONT && element.Type == D3DDECLTYPE_FLOAT4 && element.UsageIndex == 0)
|
if (element.Usage == D3DDECLUSAGE_POSITION && element.Type == D3DDECLTYPE_FLOAT3 && element.UsageIndex == 0) {
|
||||||
return D3DFVF_XYZRHW;
|
outFvf = D3DFVF_XYZ;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.Usage == D3DDECLUSAGE_POSITIONT && element.Type == D3DDECLTYPE_FLOAT4 && element.UsageIndex == 0) {
|
||||||
|
outFvf = D3DFVF_XYZRHW;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_BLENDWEIGHT && element.UsageIndex == 0) {
|
if (element.Usage == D3DDECLUSAGE_BLENDWEIGHT && element.UsageIndex == 0) {
|
||||||
DWORD fvfRet = MapD3DDeclTypeFloatToFvfXYZBn(element.Type);
|
DWORD fvfRet = MapD3DDeclTypeFloatToFvfXYZBn(element.Type);
|
||||||
if (likely(fvfRet != 0))
|
if (likely(fvfRet != 0)) {
|
||||||
return fvfRet;
|
outFvf = fvfRet;
|
||||||
else {
|
return true;
|
||||||
return 0;
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_BLENDINDICES && element.Type == D3DDECLTYPE_UBYTE4 && element.UsageIndex == 0)
|
if (element.Usage == D3DDECLUSAGE_BLENDINDICES && element.Type == D3DDECLTYPE_UBYTE4 && element.UsageIndex == 0) {
|
||||||
return D3DFVF_XYZB1;
|
outFvf = D3DFVF_XYZB1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_NORMAL && element.Type == D3DDECLTYPE_FLOAT3 && element.UsageIndex == 0)
|
if (element.Usage == D3DDECLUSAGE_NORMAL && element.Type == D3DDECLTYPE_FLOAT3 && element.UsageIndex == 0) {
|
||||||
return D3DFVF_NORMAL;
|
outFvf = D3DFVF_NORMAL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_PSIZE && element.Type == D3DDECLTYPE_FLOAT1 && element.UsageIndex == 0)
|
if (element.Usage == D3DDECLUSAGE_PSIZE && element.Type == D3DDECLTYPE_FLOAT1 && element.UsageIndex == 0) {
|
||||||
return D3DFVF_PSIZE;
|
outFvf = D3DFVF_PSIZE;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_COLOR && element.Type == D3DDECLTYPE_D3DCOLOR) {
|
if (element.Usage == D3DDECLUSAGE_COLOR && element.Type == D3DDECLTYPE_D3DCOLOR) {
|
||||||
switch (element.UsageIndex) {
|
switch (element.UsageIndex) {
|
||||||
case 0: return D3DFVF_DIFFUSE;
|
case 0:
|
||||||
case 1: return D3DFVF_SPECULAR;
|
outFvf = D3DFVF_DIFFUSE;
|
||||||
|
return true;
|
||||||
|
case 1:
|
||||||
|
outFvf = D3DFVF_SPECULAR;
|
||||||
|
return true;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (element.Usage == D3DDECLUSAGE_TEXCOORD && element.UsageIndex < 8) {
|
if (element.Usage == D3DDECLUSAGE_TEXCOORD && element.UsageIndex < 8) {
|
||||||
DWORD retFvf = 0;
|
return MapD3DDeclUsageTexCoordToFvfTexCoordSize(element, fvf, outFvf, texCountPostUpdate);
|
||||||
if (likely(MapD3DDeclUsageTexCoordToFvfTexCoordSize(element, fvf, retFvf, texCountPostUpdate)))
|
|
||||||
return retFvf;
|
|
||||||
else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -323,8 +335,13 @@ namespace dxvk {
|
||||||
DWORD fvf = 0;
|
DWORD fvf = 0;
|
||||||
DWORD texCountPostUpdate = 0;
|
DWORD texCountPostUpdate = 0;
|
||||||
|
|
||||||
for (const auto& element : m_elements)
|
for (const auto& element : m_elements) {
|
||||||
fvf |= MapD3DDeclToFvf(element, fvf, texCountPostUpdate);
|
DWORD elementFvf = 0;
|
||||||
|
if (!MapD3DDeclToFvf(element, fvf, elementFvf, texCountPostUpdate)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fvf |= elementFvf;
|
||||||
|
}
|
||||||
|
|
||||||
fvf |= (texCountPostUpdate << 8);
|
fvf |= (texCountPostUpdate << 8);
|
||||||
|
|
||||||
|
|
|
@ -68,9 +68,10 @@ namespace dxvk {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
DWORD MapD3DDeclToFvf(
|
bool MapD3DDeclToFvf(
|
||||||
const D3DVERTEXELEMENT9& element,
|
const D3DVERTEXELEMENT9& element,
|
||||||
DWORD fvf,
|
DWORD fvf,
|
||||||
|
DWORD& outFvf,
|
||||||
DWORD& texCountPostUpdate);
|
DWORD& texCountPostUpdate);
|
||||||
|
|
||||||
DWORD MapD3D9VertexElementsToFvf();
|
DWORD MapD3D9VertexElementsToFvf();
|
||||||
|
|
Loading…
Add table
Reference in a new issue