mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-08-10 10:09:22 +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"
|
#include "stdafx.h"
|
||||||
#if defined(DX12_SUPPORT)
|
#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
|
#endif
|
|
@ -1,4 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#if defined(DX12_SUPPORT)
|
#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
|
#endif
|
|
@ -194,87 +194,9 @@ void D3D12GSRender::ExecCMD(u32 cmd)
|
||||||
m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**) &commandList);
|
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)
|
void D3D12GSRender::EnableVertexData(bool indexed_draw)
|
||||||
{
|
{
|
||||||
|
m_IASet = getIALayout(m_device, indexed_draw, m_vertex_data);
|
||||||
static u32 offset_list[m_vertex_count];
|
static u32 offset_list[m_vertex_count];
|
||||||
u32 cur_offset = 0;
|
u32 cur_offset = 0;
|
||||||
|
|
||||||
|
@ -350,128 +272,6 @@ void D3D12GSRender::EnableVertexData(bool indexed_draw)
|
||||||
indexBufferView.SizeInBytes = (UINT)m_indexed_array.m_data.size();
|
indexBufferView.SizeInBytes = (UINT)m_indexed_array.m_data.size();
|
||||||
indexBufferView.BufferLocation = m_indexBuffer->GetGPUVirtualAddress();
|
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)
|
switch (type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,7 @@ struct RSXVertexData
|
||||||
bool IsEnabled() const { return size > 0; }
|
bool IsEnabled() const { return size > 0; }
|
||||||
void Load(u32 start, u32 count, u32 baseOffset, u32 baseIndex);
|
void Load(u32 start, u32 count, u32 baseOffset, u32 baseIndex);
|
||||||
|
|
||||||
u32 GetTypeSize();
|
u32 GetTypeSize() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RSXIndexArrayData
|
struct RSXIndexArrayData
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue