diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 643a4d4081..20b607536c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -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 getIALayout(ID3D12Device *device, bool indexedDraw, const RSXVertexData *vertexData) +{ + std::vector 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 \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.h b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.h index 1a857ae62c..cb363e0f6d 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.h @@ -1,4 +1,9 @@ #pragma once #if defined(DX12_SUPPORT) +#include +#include "Emu/Memory/vm.h" +#include "Emu/RSX/RSXThread.h" + +std::vector getIALayout(ID3D12Device *device, bool indexedDraw, const RSXVertexData *vertexData); #endif \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 3f1f0b13ae..e865f04546 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -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); - } } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 80cd1946f8..d3cd7129a4 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -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) { diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 6cacabc967..ded727a469 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -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