mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
Implement vertex swizzle
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
|
||||
namespace Libs::Graphics {
|
||||
|
||||
//IDK: maybe we can remove it?
|
||||
// IDK: maybe we can remove it?
|
||||
constexpr uint32_t kTemporaryPs5BufferFormat121 = 121u;
|
||||
|
||||
static bool NarrowInputFormat(VkFormat* format, uint32_t* size, uint32_t used_components) {
|
||||
@@ -561,13 +561,15 @@ void CreatePipelineInternal(PipelineCache::GraphicsPipeline* pipeline, VkRenderP
|
||||
input_attr[index].location = index;
|
||||
input_attr[index].offset = b.attr_offsets[ai];
|
||||
|
||||
uint32_t attr_size = 4;
|
||||
auto registers_num = vs_input_info->resources_dst[index].registers_num;
|
||||
auto used_components = (vs_input_info->resource_fetch_components[index] > 0
|
||||
? vs_input_info->resource_fetch_components[index]
|
||||
: registers_num);
|
||||
uint32_t attr_size = 4;
|
||||
auto registers_num = vs_input_info->resources_dst[index].registers_num;
|
||||
auto used_components = (vs_input_info->resource_fetch_components[index] > 0
|
||||
? vs_input_info->resource_fetch_components[index]
|
||||
: registers_num);
|
||||
const auto raw_components = VertexRawComponentCount(
|
||||
vs_input_info->resources[index].DstSelXYZW(), static_cast<uint32_t>(registers_num));
|
||||
GetInputFormat(vs_input_info->resources[index], &input_attr[index].format, &attr_size,
|
||||
static_cast<uint32_t>(used_components));
|
||||
raw_components);
|
||||
|
||||
if (graphics_debug_dump_enabled()) {
|
||||
static std::atomic_uint log_count = 0;
|
||||
@@ -602,73 +604,18 @@ void CreatePipelineInternal(PipelineCache::GraphicsPipeline* pipeline, VkRenderP
|
||||
EXIT_NOT_IMPLEMENTED(vs_input_info->resources[index].AddTid());
|
||||
EXIT_NOT_IMPLEMENTED(vs_input_info->resources[index].SwizzleEnabled());
|
||||
|
||||
auto log_unsupported_vertex_swizzle = [index, attr_size, registers_num](
|
||||
uint32_t swizzle, uint32_t expected) {
|
||||
static bool logged = false;
|
||||
if (!logged) {
|
||||
LOGF(
|
||||
"VertexInput: temporary: accepting unsupported dst swizzle at attr %" PRIu32
|
||||
" (attr_size=%" PRIu32 ", regs=%" PRIu32 ", swizzle=0x%03" PRIx32
|
||||
", expected=0x%03" PRIx32 ")\n",
|
||||
static_cast<uint32_t>(index), attr_size, registers_num, swizzle, expected);
|
||||
logged = true;
|
||||
if (registers_num < 1 || registers_num > 4) {
|
||||
EXIT("invalid vertex destination register count: %u\n", registers_num);
|
||||
}
|
||||
for (uint32_t component = 0; component < static_cast<uint32_t>(registers_num);
|
||||
component++) {
|
||||
const auto selector =
|
||||
GetDstSel(vs_input_info->resources[index].DstSelXYZW(), component);
|
||||
if (DecodeVertexDstSelector(selector).kind == VertexDstSelectKind::Reserved) {
|
||||
EXIT("unsupported reserved vertex dst selector: attr=%u component=%u "
|
||||
"selector=%u\n",
|
||||
static_cast<uint32_t>(index), component, selector);
|
||||
}
|
||||
};
|
||||
|
||||
switch (registers_num) {
|
||||
case 1: {
|
||||
auto swizzle = vs_input_info->resources[index].DstSelX();
|
||||
if (swizzle != DstSel(4)) {
|
||||
log_unsupported_vertex_swizzle(swizzle, DstSel(4));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
auto swizzle = vs_input_info->resources[index].DstSelXY();
|
||||
auto expected = (attr_size == 1 ? DstSel(4, 0) : DstSel(4, 5));
|
||||
if (swizzle != expected) {
|
||||
log_unsupported_vertex_swizzle(swizzle, expected);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
auto swizzle = vs_input_info->resources[index].DstSelXYZ();
|
||||
auto expected =
|
||||
(attr_size == 1 ? DstSel(4, 0, 0)
|
||||
: (attr_size == 2 ? DstSel(4, 5, 0) : DstSel(4, 5, 6)));
|
||||
if (swizzle != expected) {
|
||||
log_unsupported_vertex_swizzle(swizzle, expected);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
auto swizzle = vs_input_info->resources[index].DstSelXYZW();
|
||||
auto expected = DstSel(4, 5, 6, 7);
|
||||
bool supported = false;
|
||||
switch (attr_size) {
|
||||
case 1:
|
||||
expected = DstSel(4, 0, 0, 1);
|
||||
supported = (swizzle == expected);
|
||||
break;
|
||||
case 2:
|
||||
expected = DstSel(4, 5, 0, 1);
|
||||
supported = (swizzle == expected);
|
||||
break;
|
||||
case 3:
|
||||
expected = DstSel(4, 5, 6, 1);
|
||||
supported = (swizzle == expected || swizzle == DstSel(4, 5, 6, 0));
|
||||
break;
|
||||
default:
|
||||
supported = (swizzle == expected || swizzle == DstSel(4, 5, 6, 1) ||
|
||||
swizzle == DstSel(4, 5, 6, 0));
|
||||
break;
|
||||
}
|
||||
if (!supported) {
|
||||
log_unsupported_vertex_swizzle(swizzle, expected);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: EXIT("invalid registers_num");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user