mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 12:05:23 +00:00
d3d12; Factorise IALayout generation code
This commit is contained in:
parent
14e9323154
commit
8ec9f84c1b
5 changed files with 231 additions and 203 deletions
|
@ -1,4 +1,227 @@
|
|||
#include "stdafx.h"
|
||||
#if defined(DX12_SUPPORT)
|
||||
#include "D3D12Buffer.h"
|
||||
#include "Utilities/Log.h"
|
||||
|
||||
const int g_vertexCount = 32;
|
||||
|
||||
// Where are these type defined ???
|
||||
static
|
||||
DXGI_FORMAT getFormat(u8 type, u8 size)
|
||||
{
|
||||
/*static const u32 gl_types[] =
|
||||
{
|
||||
GL_SHORT,
|
||||
GL_FLOAT,
|
||||
GL_HALF_FLOAT,
|
||||
GL_UNSIGNED_BYTE,
|
||||
GL_SHORT,
|
||||
GL_FLOAT, // Needs conversion
|
||||
GL_UNSIGNED_BYTE,
|
||||
};
|
||||
|
||||
static const bool gl_normalized[] =
|
||||
{
|
||||
GL_TRUE,
|
||||
GL_FALSE,
|
||||
GL_FALSE,
|
||||
GL_TRUE,
|
||||
GL_FALSE,
|
||||
GL_TRUE,
|
||||
GL_FALSE,
|
||||
};*/
|
||||
static const DXGI_FORMAT typeX1[] =
|
||||
{
|
||||
DXGI_FORMAT_R16_SNORM,
|
||||
DXGI_FORMAT_R32_FLOAT,
|
||||
DXGI_FORMAT_R16_FLOAT,
|
||||
DXGI_FORMAT_R8_UNORM,
|
||||
DXGI_FORMAT_R16_SINT,
|
||||
DXGI_FORMAT_R32_FLOAT,
|
||||
DXGI_FORMAT_R8_UINT
|
||||
};
|
||||
static const DXGI_FORMAT typeX2[] =
|
||||
{
|
||||
DXGI_FORMAT_R16G16_SNORM,
|
||||
DXGI_FORMAT_R32G32_FLOAT,
|
||||
DXGI_FORMAT_R16G16_FLOAT,
|
||||
DXGI_FORMAT_R8G8_UNORM,
|
||||
DXGI_FORMAT_R16G16_SINT,
|
||||
DXGI_FORMAT_R32G32_FLOAT,
|
||||
DXGI_FORMAT_R8G8_UINT
|
||||
};
|
||||
static const DXGI_FORMAT typeX3[] =
|
||||
{
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT
|
||||
};
|
||||
static const DXGI_FORMAT typeX4[] =
|
||||
{
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT
|
||||
};
|
||||
|
||||
switch (size)
|
||||
{
|
||||
case 1:
|
||||
return typeX1[type];
|
||||
case 2:
|
||||
return typeX2[type];
|
||||
case 3:
|
||||
return typeX3[type];
|
||||
case 4:
|
||||
return typeX4[type];
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<D3D12_INPUT_ELEMENT_DESC> getIALayout(ID3D12Device *device, bool indexedDraw, const RSXVertexData *vertexData)
|
||||
{
|
||||
std::vector<D3D12_INPUT_ELEMENT_DESC> result;
|
||||
u32 offset_list[g_vertexCount];
|
||||
u32 cur_offset = 0;
|
||||
|
||||
const u32 data_offset = indexedDraw ? 0 : 1;// m_draw_array_first;
|
||||
|
||||
for (u32 i = 0; i < g_vertexCount; ++i)
|
||||
{
|
||||
offset_list[i] = cur_offset;
|
||||
|
||||
if (!vertexData[i].IsEnabled()) continue;
|
||||
const size_t item_size = vertexData[i].GetTypeSize() * vertexData[i].size;
|
||||
const size_t data_size = vertexData[i].data.size() - data_offset * item_size;
|
||||
cur_offset += data_size;
|
||||
}
|
||||
|
||||
#if DUMP_VERTEX_DATA
|
||||
rFile dump("VertexDataArray.dump", rFile::write);
|
||||
#endif
|
||||
|
||||
for (u32 i = 0; i < g_vertexCount; ++i)
|
||||
{
|
||||
if (!vertexData[i].IsEnabled()) continue;
|
||||
|
||||
#if DUMP_VERTEX_DATA
|
||||
dump.Write(wxString::Format("VertexData[%d]:\n", i));
|
||||
switch (m_vertex_data[i].type)
|
||||
{
|
||||
case CELL_GCM_VERTEX_S1:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 2)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", *(u16*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 2) / 2) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_F:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 4)
|
||||
{
|
||||
dump.Write(wxString::Format("%.01f\n", *(float*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 4) / 4) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_SF:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 2)
|
||||
{
|
||||
dump.Write(wxString::Format("%.01f\n", *(float*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 2) / 2) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_UB:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); ++j)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", m_vertex_data[i].data[j]));
|
||||
if (!((j + 1) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_S32K:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 2)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", *(u16*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 2) / 2) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
// case CELL_GCM_VERTEX_CMP:
|
||||
|
||||
case CELL_GCM_VERTEX_UB256:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); ++j)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", m_vertex_data[i].data[j]));
|
||||
if (!((j + 1) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_ERROR(HLE, "Bad cv type! %d", m_vertex_data[i].type);
|
||||
return;
|
||||
}
|
||||
|
||||
dump.Write("\n");
|
||||
#endif
|
||||
|
||||
if (vertexData[i].type < 1 || vertexData[i].type > 7)
|
||||
{
|
||||
LOG_ERROR(RSX, "GLGSRender::EnableVertexData: Bad vertex data type (%d)!", vertexData[i].type);
|
||||
}
|
||||
|
||||
D3D12_INPUT_ELEMENT_DESC IAElement = {};
|
||||
/* if (!m_vertex_data[i].addr)
|
||||
{
|
||||
switch (m_vertex_data[i].type)
|
||||
{
|
||||
case CELL_GCM_VERTEX_S32K:
|
||||
case CELL_GCM_VERTEX_S1:
|
||||
switch (m_vertex_data[i].size)
|
||||
{
|
||||
case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break;
|
||||
case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break;
|
||||
case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break;
|
||||
case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break;
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_F:
|
||||
switch (m_vertex_data[i].size)
|
||||
{
|
||||
case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break;
|
||||
case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break;
|
||||
case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break;
|
||||
case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break;
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_CMP:
|
||||
case CELL_GCM_VERTEX_UB:
|
||||
glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
checkForGlError("glVertexAttrib");
|
||||
}
|
||||
else*/
|
||||
{
|
||||
IAElement.SemanticName = "TEXCOORD";
|
||||
IAElement.SemanticIndex = i;
|
||||
IAElement.Format = getFormat(vertexData[i].type - 1, vertexData[i].size);
|
||||
|
||||
IAElement.AlignedByteOffset = offset_list[i];
|
||||
}
|
||||
result.push_back(IAElement);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,4 +1,9 @@
|
|||
#pragma once
|
||||
#if defined(DX12_SUPPORT)
|
||||
#include <d3d12.h>
|
||||
#include "Emu/Memory/vm.h"
|
||||
#include "Emu/RSX/RSXThread.h"
|
||||
|
||||
std::vector<D3D12_INPUT_ELEMENT_DESC> getIALayout(ID3D12Device *device, bool indexedDraw, const RSXVertexData *vertexData);
|
||||
|
||||
#endif
|
|
@ -194,87 +194,9 @@ void D3D12GSRender::ExecCMD(u32 cmd)
|
|||
m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**) &commandList);
|
||||
}
|
||||
|
||||
// Where are these type defined ???
|
||||
static
|
||||
DXGI_FORMAT getFormat(u8 type, u8 size)
|
||||
{
|
||||
/*static const u32 gl_types[] =
|
||||
{
|
||||
GL_SHORT,
|
||||
GL_FLOAT,
|
||||
GL_HALF_FLOAT,
|
||||
GL_UNSIGNED_BYTE,
|
||||
GL_SHORT,
|
||||
GL_FLOAT, // Needs conversion
|
||||
GL_UNSIGNED_BYTE,
|
||||
};
|
||||
|
||||
static const bool gl_normalized[] =
|
||||
{
|
||||
GL_TRUE,
|
||||
GL_FALSE,
|
||||
GL_FALSE,
|
||||
GL_TRUE,
|
||||
GL_FALSE,
|
||||
GL_TRUE,
|
||||
GL_FALSE,
|
||||
};*/
|
||||
static const DXGI_FORMAT typeX1[] =
|
||||
{
|
||||
DXGI_FORMAT_R16_SNORM,
|
||||
DXGI_FORMAT_R32_FLOAT,
|
||||
DXGI_FORMAT_R16_FLOAT,
|
||||
DXGI_FORMAT_R8_UNORM,
|
||||
DXGI_FORMAT_R16_SINT,
|
||||
DXGI_FORMAT_R32_FLOAT,
|
||||
DXGI_FORMAT_R8_UINT
|
||||
};
|
||||
static const DXGI_FORMAT typeX2[] =
|
||||
{
|
||||
DXGI_FORMAT_R16G16_SNORM,
|
||||
DXGI_FORMAT_R32G32_FLOAT,
|
||||
DXGI_FORMAT_R16G16_FLOAT,
|
||||
DXGI_FORMAT_R8G8_UNORM,
|
||||
DXGI_FORMAT_R16G16_SINT,
|
||||
DXGI_FORMAT_R32G32_FLOAT,
|
||||
DXGI_FORMAT_R8G8_UINT
|
||||
};
|
||||
static const DXGI_FORMAT typeX3[] =
|
||||
{
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT
|
||||
};
|
||||
static const DXGI_FORMAT typeX4[] =
|
||||
{
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT
|
||||
};
|
||||
|
||||
switch (size)
|
||||
{
|
||||
case 1:
|
||||
return typeX1[type];
|
||||
case 2:
|
||||
return typeX2[type];
|
||||
case 3:
|
||||
return typeX3[type];
|
||||
case 4:
|
||||
return typeX4[type];
|
||||
}
|
||||
}
|
||||
|
||||
void D3D12GSRender::EnableVertexData(bool indexed_draw)
|
||||
{
|
||||
m_IASet = getIALayout(m_device, indexed_draw, m_vertex_data);
|
||||
static u32 offset_list[m_vertex_count];
|
||||
u32 cur_offset = 0;
|
||||
|
||||
|
@ -350,128 +272,6 @@ void D3D12GSRender::EnableVertexData(bool indexed_draw)
|
|||
indexBufferView.SizeInBytes = (UINT)m_indexed_array.m_data.size();
|
||||
indexBufferView.BufferLocation = m_indexBuffer->GetGPUVirtualAddress();
|
||||
}
|
||||
|
||||
#if DUMP_VERTEX_DATA
|
||||
rFile dump("VertexDataArray.dump", rFile::write);
|
||||
#endif
|
||||
|
||||
m_IASet.clear();
|
||||
|
||||
for (u32 i = 0; i < m_vertex_count; ++i)
|
||||
{
|
||||
if (!m_vertex_data[i].IsEnabled()) continue;
|
||||
|
||||
#if DUMP_VERTEX_DATA
|
||||
dump.Write(wxString::Format("VertexData[%d]:\n", i));
|
||||
switch (m_vertex_data[i].type)
|
||||
{
|
||||
case CELL_GCM_VERTEX_S1:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 2)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", *(u16*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 2) / 2) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_F:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 4)
|
||||
{
|
||||
dump.Write(wxString::Format("%.01f\n", *(float*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 4) / 4) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_SF:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 2)
|
||||
{
|
||||
dump.Write(wxString::Format("%.01f\n", *(float*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 2) / 2) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_UB:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); ++j)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", m_vertex_data[i].data[j]));
|
||||
if (!((j + 1) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_S32K:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); j += 2)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", *(u16*)&m_vertex_data[i].data[j]));
|
||||
if (!(((j + 2) / 2) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
// case CELL_GCM_VERTEX_CMP:
|
||||
|
||||
case CELL_GCM_VERTEX_UB256:
|
||||
for (u32 j = 0; j < m_vertex_data[i].data.size(); ++j)
|
||||
{
|
||||
dump.Write(wxString::Format("%d\n", m_vertex_data[i].data[j]));
|
||||
if (!((j + 1) % m_vertex_data[i].size)) dump.Write("\n");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_ERROR(HLE, "Bad cv type! %d", m_vertex_data[i].type);
|
||||
return;
|
||||
}
|
||||
|
||||
dump.Write("\n");
|
||||
#endif
|
||||
|
||||
if (m_vertex_data[i].type < 1 || m_vertex_data[i].type > 7)
|
||||
{
|
||||
LOG_ERROR(RSX, "GLGSRender::EnableVertexData: Bad vertex data type (%d)!", m_vertex_data[i].type);
|
||||
}
|
||||
|
||||
D3D12_INPUT_ELEMENT_DESC IAElement = {};
|
||||
/* if (!m_vertex_data[i].addr)
|
||||
{
|
||||
switch (m_vertex_data[i].type)
|
||||
{
|
||||
case CELL_GCM_VERTEX_S32K:
|
||||
case CELL_GCM_VERTEX_S1:
|
||||
switch (m_vertex_data[i].size)
|
||||
{
|
||||
case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break;
|
||||
case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break;
|
||||
case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break;
|
||||
case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break;
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_F:
|
||||
switch (m_vertex_data[i].size)
|
||||
{
|
||||
case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break;
|
||||
case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break;
|
||||
case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break;
|
||||
case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break;
|
||||
}
|
||||
break;
|
||||
|
||||
case CELL_GCM_VERTEX_CMP:
|
||||
case CELL_GCM_VERTEX_UB:
|
||||
glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
checkForGlError("glVertexAttrib");
|
||||
}
|
||||
else*/
|
||||
{
|
||||
IAElement.SemanticName = "TEXCOORD";
|
||||
IAElement.SemanticIndex = i;
|
||||
IAElement.Format = getFormat(m_vertex_data[i].type - 1, m_vertex_data[i].size);
|
||||
|
||||
IAElement.AlignedByteOffset = offset_list[i];
|
||||
}
|
||||
m_IASet.push_back(IAElement);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ void RSXVertexData::Load(u32 start, u32 count, u32 baseOffset, u32 baseIndex = 0
|
|||
}
|
||||
}
|
||||
|
||||
u32 RSXVertexData::GetTypeSize()
|
||||
u32 RSXVertexData::GetTypeSize() const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
|
|
|
@ -37,7 +37,7 @@ struct RSXVertexData
|
|||
bool IsEnabled() const { return size > 0; }
|
||||
void Load(u32 start, u32 count, u32 baseOffset, u32 baseIndex);
|
||||
|
||||
u32 GetTypeSize();
|
||||
u32 GetTypeSize() const;
|
||||
};
|
||||
|
||||
struct RSXIndexArrayData
|
||||
|
|
Loading…
Add table
Reference in a new issue