mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 15:01:28 +12:00
d3d12: Fix vertex error in stencil reflect
This commit is contained in:
parent
381260a493
commit
e3b73f9ea0
1 changed files with 14 additions and 11 deletions
|
@ -94,7 +94,7 @@ struct VertexBufferFormat
|
||||||
size_t stride;
|
size_t stride;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<D3D12_INPUT_ELEMENT_DESC> getIALayout(ID3D12Device *device, const std::vector<VertexBufferFormat> &vertexBufferFormat, const RSXVertexData *vertexData)
|
std::vector<D3D12_INPUT_ELEMENT_DESC> getIALayout(ID3D12Device *device, const std::vector<VertexBufferFormat> &vertexBufferFormat, const RSXVertexData *m_vertex_data)
|
||||||
{
|
{
|
||||||
std::vector<D3D12_INPUT_ELEMENT_DESC> result;
|
std::vector<D3D12_INPUT_ELEMENT_DESC> result;
|
||||||
|
|
||||||
|
@ -102,12 +102,13 @@ std::vector<D3D12_INPUT_ELEMENT_DESC> getIALayout(ID3D12Device *device, const st
|
||||||
{
|
{
|
||||||
for (size_t attributeId : vertexBufferFormat[inputSlot].attributeId)
|
for (size_t attributeId : vertexBufferFormat[inputSlot].attributeId)
|
||||||
{
|
{
|
||||||
|
const RSXVertexData &vertexData = m_vertex_data[attributeId];
|
||||||
D3D12_INPUT_ELEMENT_DESC IAElement = {};
|
D3D12_INPUT_ELEMENT_DESC IAElement = {};
|
||||||
IAElement.SemanticName = "TEXCOORD";
|
IAElement.SemanticName = "TEXCOORD";
|
||||||
IAElement.SemanticIndex = (UINT)attributeId;
|
IAElement.SemanticIndex = (UINT)attributeId;
|
||||||
IAElement.InputSlot = (UINT)inputSlot;
|
IAElement.InputSlot = (UINT)inputSlot;
|
||||||
IAElement.Format = getFormat(vertexData[attributeId].type - 1, vertexData[attributeId].size);
|
IAElement.Format = getFormat(vertexData.type - 1, vertexData.size);
|
||||||
IAElement.AlignedByteOffset = (UINT)(vertexData[attributeId].addr - vertexBufferFormat[inputSlot].range.first);
|
IAElement.AlignedByteOffset = (UINT)(vertexData.addr - vertexBufferFormat[inputSlot].range.first);
|
||||||
result.push_back(IAElement);
|
result.push_back(IAElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,17 +149,19 @@ bool overlaps(const std::pair<size_t, size_t> &range1, const std::pair<size_t, s
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
std::vector<VertexBufferFormat> FormatVertexData(RSXVertexData *m_vertex_data)
|
std::vector<VertexBufferFormat> FormatVertexData(const RSXVertexData *m_vertex_data)
|
||||||
{
|
{
|
||||||
std::vector<VertexBufferFormat> Result;
|
std::vector<VertexBufferFormat> Result;
|
||||||
for (size_t i = 0; i < 32; ++i)
|
for (size_t i = 0; i < 32; ++i)
|
||||||
{
|
{
|
||||||
if (!m_vertex_data[i].IsEnabled()) continue;
|
const RSXVertexData &vertexData = m_vertex_data[i];
|
||||||
size_t elementCount = m_vertex_data[i].data.size() / (m_vertex_data[i].size * m_vertex_data[i].GetTypeSize());
|
if (!vertexData.IsEnabled()) continue;
|
||||||
|
|
||||||
|
size_t elementCount = vertexData.data.size() / (vertexData.size * vertexData.GetTypeSize());
|
||||||
// If there is a single element, stride is 0, use the size of element instead
|
// If there is a single element, stride is 0, use the size of element instead
|
||||||
size_t stride = m_vertex_data[i].stride;
|
size_t stride = vertexData.stride;
|
||||||
size_t elementSize = m_vertex_data[i].GetTypeSize();
|
size_t elementSize = vertexData.GetTypeSize();
|
||||||
std::pair<size_t, size_t> range = std::make_pair(m_vertex_data[i].addr, m_vertex_data[i].addr + elementSize + elementCount * stride);
|
std::pair<size_t, size_t> range = std::make_pair(vertexData.addr, vertexData.addr + elementSize * vertexData.size + (elementCount - 1) * stride - 1);
|
||||||
bool isMerged = false;
|
bool isMerged = false;
|
||||||
|
|
||||||
for (VertexBufferFormat &vbf : Result)
|
for (VertexBufferFormat &vbf : Result)
|
||||||
|
@ -189,7 +192,7 @@ std::vector<VertexBufferFormat> FormatVertexData(RSXVertexData *m_vertex_data)
|
||||||
static
|
static
|
||||||
ID3D12Resource *createVertexBuffer(const VertexBufferFormat &vbf, const RSXVertexData *vertexData, ID3D12Device *device, DataHeap &vertexIndexHeap)
|
ID3D12Resource *createVertexBuffer(const VertexBufferFormat &vbf, const RSXVertexData *vertexData, ID3D12Device *device, DataHeap &vertexIndexHeap)
|
||||||
{
|
{
|
||||||
size_t subBufferSize = vbf.range.second - vbf.range.first;
|
size_t subBufferSize = vbf.range.second - vbf.range.first + 1;
|
||||||
assert(vertexIndexHeap.canAlloc(subBufferSize));
|
assert(vertexIndexHeap.canAlloc(subBufferSize));
|
||||||
size_t heapOffset = vertexIndexHeap.alloc(subBufferSize);
|
size_t heapOffset = vertexIndexHeap.alloc(subBufferSize);
|
||||||
|
|
||||||
|
@ -260,7 +263,7 @@ std::pair<std::vector<D3D12_VERTEX_BUFFER_VIEW>, D3D12_INDEX_BUFFER_VIEW> D3D12G
|
||||||
for (size_t buffer = 0; buffer < vertexBufferFormat.size(); buffer++)
|
for (size_t buffer = 0; buffer < vertexBufferFormat.size(); buffer++)
|
||||||
{
|
{
|
||||||
const VertexBufferFormat &vbf = vertexBufferFormat[buffer];
|
const VertexBufferFormat &vbf = vertexBufferFormat[buffer];
|
||||||
size_t subBufferSize = vbf.range.second - vbf.range.first;
|
size_t subBufferSize = vbf.range.second - vbf.range.first + 1;
|
||||||
|
|
||||||
ID3D12Resource *vertexBuffer = createVertexBuffer(vbf, m_vertex_data, m_device, m_vertexIndexData);
|
ID3D12Resource *vertexBuffer = createVertexBuffer(vbf, m_vertex_data, m_device, m_vertexIndexData);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue