mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
graphics: store vertex attribute bindings without duplicated arrays
This commit is contained in:
@@ -336,14 +336,15 @@ static void ShaderDetectBuffers(ShaderVertexInputInfo& info) {
|
||||
for (int ri = 0; ri < info.resources_num; ri++) {
|
||||
const auto& r = info.resources[ri];
|
||||
|
||||
bool merged = false;
|
||||
for (int bi = 0; bi < info.buffers_num; bi++) {
|
||||
auto& destination = info.resources_dst[ri];
|
||||
int bi = 0;
|
||||
for (; bi < info.buffers_num; bi++) {
|
||||
auto& b = info.buffers[bi];
|
||||
|
||||
uint64_t stride = b.stride;
|
||||
|
||||
if (stride == r.Stride() &&
|
||||
b.fetch_index == static_cast<uint32_t>(info.resources_dst[ri].fetch_index)) {
|
||||
b.fetch_index == destination.fetch_index) {
|
||||
uint64_t rbase = r.Base48();
|
||||
uint64_t base = std::min(rbase, b.addr);
|
||||
uint64_t offset1 = rbase - base;
|
||||
@@ -352,31 +353,20 @@ static void ShaderDetectBuffers(ShaderVertexInputInfo& info) {
|
||||
if (offset1 < stride && offset2 < stride) {
|
||||
EXIT_NOT_IMPLEMENTED(b.num_records != r.NumRecords());
|
||||
b.addr = base;
|
||||
EXIT_NOT_IMPLEMENTED(b.attr_num >= ShaderVertexInputBuffer::ATTR_MAX);
|
||||
b.attr_indices[b.attr_num++] = ri;
|
||||
merged = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!merged) {
|
||||
if (bi == info.buffers_num) {
|
||||
EXIT_NOT_IMPLEMENTED(info.buffers_num >= ShaderVertexInputInfo::RES_MAX);
|
||||
int bi = info.buffers_num++;
|
||||
info.buffers[bi].addr = r.Base48();
|
||||
info.buffers[bi].stride = r.Stride();
|
||||
info.buffers[bi].num_records = r.NumRecords();
|
||||
info.buffers[bi].fetch_index = info.resources_dst[ri].fetch_index;
|
||||
info.buffers[bi].attr_num = 1;
|
||||
info.buffers[bi].attr_indices[0] = ri;
|
||||
}
|
||||
}
|
||||
|
||||
for (int bi = 0; bi < info.buffers_num; bi++) {
|
||||
auto& b = info.buffers[bi];
|
||||
for (int ri = 0; ri < b.attr_num; ri++) {
|
||||
b.attr_offsets[ri] = info.resources[b.attr_indices[ri]].Base48() - b.addr;
|
||||
info.buffers[bi] = {.addr = r.Base48(),
|
||||
.stride = r.Stride(),
|
||||
.num_records = r.NumRecords(),
|
||||
.fetch_index = destination.fetch_index};
|
||||
info.buffers_num++;
|
||||
}
|
||||
destination.buffer_index = bi;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -907,8 +897,9 @@ void ShaderDbgDumpInputInfo(const ShaderVertexInputInfo& info) {
|
||||
|
||||
LOGF("\t\t register_start = %d\n"
|
||||
"\t\t registers_num = %d\n"
|
||||
"\t\t fetch_index = %" PRIu32 "\n",
|
||||
rd.register_start, rd.registers_num, rd.fetch_index);
|
||||
"\t\t fetch_index = %" PRIu32 "\n"
|
||||
"\t\t buffer_index = %d\n",
|
||||
rd.register_start, rd.registers_num, rd.fetch_index, rd.buffer_index);
|
||||
LOGF("\t\t fields = %08" PRIx32 "%08" PRIx32 "%08" PRIx32 "%08" PRIx32 "\n",
|
||||
r.fields[3], r.fields[2], r.fields[1], r.fields[0]);
|
||||
LOGF("\t\t Base() = %" PRIx64 "\n"
|
||||
@@ -934,14 +925,8 @@ void ShaderDbgDumpInputInfo(const ShaderVertexInputInfo& info) {
|
||||
LOGF("\t\t addr = %" PRIx64 "\n"
|
||||
"\t\t stride = %" PRIu32 "\n"
|
||||
"\t\t num_records = %" PRIu32 "\n"
|
||||
"\t\t fetch_index = %" PRIu32 "\n"
|
||||
"\t\t attr_num = %" PRId32 "\n",
|
||||
r.addr, r.stride, r.num_records, r.fetch_index, r.attr_num);
|
||||
for (int j = 0; j < r.attr_num; j++) {
|
||||
LOGF("\t\t attr_indices[%d] = %d\n"
|
||||
"\t\t attr_offsets[%d] = %u\n",
|
||||
j, r.attr_indices[j], j, r.attr_offsets[j]);
|
||||
}
|
||||
"\t\t fetch_index = %" PRIu32 "\n",
|
||||
r.addr, r.stride, r.num_records, r.fetch_index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user