mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
graphics: support Standard64KB color target arrays (#315)
graphics: support Standard64KB render target arrays Co-authored-by: nmzik <Nmzik@mail.ru>
This commit is contained in:
@@ -219,8 +219,9 @@ void RenderExecutor::ResolveRenderColorTarget(uint64_t submit_id, CommandBuffer&
|
|||||||
rt.attrib.num_fragments, bytes_per_element, rt.cmask.addr, rt.fmask.addr,
|
rt.attrib.num_fragments, bytes_per_element, rt.cmask.addr, rt.fmask.addr,
|
||||||
rt.dcc_addr.addr);
|
rt.dcc_addr.addr);
|
||||||
}
|
}
|
||||||
if ((standard64 || depth_tile) && (rt.attrib3.dimension != 1 || rt.attrib3.depth != 0 ||
|
if ((standard64 || depth_tile) &&
|
||||||
view.base_layer != 0 || view.image_layers != 1)) {
|
(rt.attrib3.dimension != 1 || rt.attrib3.depth != 0 ||
|
||||||
|
(depth_tile && (view.base_layer != 0 || view.image_layers != 1)))) {
|
||||||
EXIT("unsupported 64KB texture-tiled render-target view: dimension=%u depth=%u"
|
EXIT("unsupported 64KB texture-tiled render-target view: dimension=%u depth=%u"
|
||||||
" layer=%u/%u\n",
|
" layer=%u/%u\n",
|
||||||
rt.attrib3.dimension, rt.attrib3.depth, view.base_layer, view.image_layers);
|
rt.attrib3.dimension, rt.attrib3.depth, view.base_layer, view.image_layers);
|
||||||
|
|||||||
@@ -7283,26 +7283,30 @@ public:
|
|||||||
std::printf("[gpu] %-32s ok\n", name);
|
std::printf("[gpu] %-32s ok\n", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckRenderExecutorColorStandard4TileDiscovery() {
|
void CheckRenderExecutorColorStandardTileDiscovery() {
|
||||||
constexpr const char *name = "RenderExecutorColorStandard4Tile";
|
constexpr const char *name = "RenderExecutorColorStandardTile";
|
||||||
constexpr uintptr_t base = 0x0000000203b00000ull;
|
constexpr uintptr_t base = 0x0000000203b00000ull;
|
||||||
constexpr uint64_t target_address = base + 0x4000;
|
constexpr uint64_t allocation_size = 0x190000;
|
||||||
constexpr uint64_t target_size = 0x180000;
|
constexpr uint64_t allocation_alignment = 0x10000;
|
||||||
constexpr uint64_t allocation_size = 0x184000;
|
|
||||||
constexpr uint64_t allocation_alignment = 0x4000;
|
|
||||||
constexpr auto format = Prospero::BufferFormat::k32Float;
|
constexpr auto format = Prospero::BufferFormat::k32Float;
|
||||||
constexpr auto tile = Prospero::TileMode::kStandard4KB;
|
struct TileCase {
|
||||||
|
Prospero::TileMode tile;
|
||||||
|
uint64_t target_offset;
|
||||||
|
uint64_t alignment;
|
||||||
|
};
|
||||||
|
constexpr std::array cases{
|
||||||
|
TileCase{Prospero::TileMode::kStandard4KB, 0x4000, 0x1000},
|
||||||
|
TileCase{Prospero::TileMode::kStandard64KB, 0x10000, 0x10000},
|
||||||
|
};
|
||||||
EnsureRuntimeContext();
|
EnsureRuntimeContext();
|
||||||
|
|
||||||
const auto pitch = TileGetTexturePitch(format, 256, tile);
|
const auto odd_pitch =
|
||||||
TileSizeAlign slice{};
|
TileGetTexturePitch(format, 257, Prospero::TileMode::kStandard4KB);
|
||||||
TileGetTextureSize(format, 256, 256, 1, tile, &slice, nullptr, nullptr);
|
|
||||||
const auto odd_pitch = TileGetTexturePitch(format, 257, tile);
|
|
||||||
TileSizeAlign odd_slice{};
|
TileSizeAlign odd_slice{};
|
||||||
TileGetTextureSize(format, 257, 131, 1, tile, &odd_slice, nullptr, nullptr);
|
TileGetTextureSize(format, 257, 131, 1, Prospero::TileMode::kStandard4KB,
|
||||||
|
&odd_slice, nullptr, nullptr);
|
||||||
Require(name, "tile layout",
|
Require(name, "tile layout",
|
||||||
pitch == 256 && slice.size == 0x40000 && slice.align == 0x1000 &&
|
odd_pitch == 288 && odd_slice.size == 0x2d000 &&
|
||||||
odd_pitch == 288 && odd_slice.size == 0x2d000 &&
|
|
||||||
odd_slice.align == 0x1000,
|
odd_slice.align == 0x1000,
|
||||||
"Standard4KB pitch, footprint, or block alignment is incorrect");
|
"Standard4KB pitch, footprint, or block alignment is incorrect");
|
||||||
|
|
||||||
@@ -7311,17 +7315,29 @@ public:
|
|||||||
Libs::LibKernel::Memory::KernelAllocateDirectMemory(
|
Libs::LibKernel::Memory::KernelAllocateDirectMemory(
|
||||||
0, Libs::LibKernel::Memory::KernelGetDirectMemorySize(),
|
0, Libs::LibKernel::Memory::KernelGetDirectMemorySize(),
|
||||||
allocation_size, allocation_alignment, 0, &direct_offset) == 0,
|
allocation_size, allocation_alignment, 0, &direct_offset) == 0,
|
||||||
"Standard4KB color allocation failed");
|
"standard-tiled color allocation failed");
|
||||||
void *mapped = reinterpret_cast<void *>(base);
|
void *mapped = reinterpret_cast<void *>(base);
|
||||||
Require(name, "direct mapping",
|
Require(name, "direct mapping",
|
||||||
Libs::LibKernel::Memory::KernelMapDirectMemory(
|
Libs::LibKernel::Memory::KernelMapDirectMemory(
|
||||||
&mapped, allocation_size, 0x3, 0x10, direct_offset,
|
&mapped, allocation_size, 0x3, 0x10, direct_offset,
|
||||||
allocation_alignment) == 0 &&
|
allocation_alignment) == 0 &&
|
||||||
mapped == reinterpret_cast<void *>(base),
|
mapped == reinterpret_cast<void *>(base),
|
||||||
"Standard4KB color mapping failed");
|
"standard-tiled color mapping failed");
|
||||||
std::memset(mapped, 0, allocation_size);
|
std::memset(mapped, 0, allocation_size);
|
||||||
|
|
||||||
{
|
for (const auto &tile_case : cases) {
|
||||||
|
const auto pitch = TileGetTexturePitch(format, 256, tile_case.tile);
|
||||||
|
TileSizeAlign slice{};
|
||||||
|
TileGetTextureSize(format, 256, 256, 1, tile_case.tile, &slice, nullptr,
|
||||||
|
nullptr);
|
||||||
|
Require(
|
||||||
|
name, "tile layout",
|
||||||
|
pitch == 256 && slice.size == 0x40000 &&
|
||||||
|
slice.align == tile_case.alignment,
|
||||||
|
"standard tile pitch, footprint, or block alignment is incorrect");
|
||||||
|
|
||||||
|
const auto target_address = base + tile_case.target_offset;
|
||||||
|
const auto target_size = slice.size * 6ull;
|
||||||
RenderContext context(m_runtime_context);
|
RenderContext context(m_runtime_context);
|
||||||
auto &scheduler = context.GetCommandScheduler();
|
auto &scheduler = context.GetCommandScheduler();
|
||||||
HW::Context registers{};
|
HW::Context registers{};
|
||||||
@@ -7335,7 +7351,7 @@ public:
|
|||||||
registers.SetColorView(
|
registers.SetColorView(
|
||||||
0, {.base_array_slice_index = 5, .last_array_slice_index = 5});
|
0, {.base_array_slice_index = 5, .last_array_slice_index = 5});
|
||||||
registers.SetColorAttrib2(0, {.height = 255, .width = 255});
|
registers.SetColorAttrib2(0, {.height = 255, .width = 255});
|
||||||
registers.SetColorAttrib3(0, {.tile_mode = tile,
|
registers.SetColorAttrib3(0, {.tile_mode = tile_case.tile,
|
||||||
.dimension = 1,
|
.dimension = 1,
|
||||||
.cmask_pipe_aligned = true,
|
.cmask_pipe_aligned = true,
|
||||||
.dcc_pipe_aligned = true});
|
.dcc_pipe_aligned = true});
|
||||||
@@ -7358,7 +7374,7 @@ public:
|
|||||||
color.base_array_layer == 5 &&
|
color.base_array_layer == 5 &&
|
||||||
color.desc.info.data.address == target_address &&
|
color.desc.info.data.address == target_address &&
|
||||||
color.desc.info.data.size == target_size &&
|
color.desc.info.data.size == target_size &&
|
||||||
color.desc.info.tile_mode == tile &&
|
color.desc.info.tile_mode == tile_case.tile &&
|
||||||
color.desc.info.extent == vk::Extent3D{256, 256, 1} &&
|
color.desc.info.extent == vk::Extent3D{256, 256, 1} &&
|
||||||
color.desc.info.resources == ImageSubresources{1, 6} &&
|
color.desc.info.resources == ImageSubresources{1, 6} &&
|
||||||
color.desc.info.pitch == pitch &&
|
color.desc.info.pitch == pitch &&
|
||||||
@@ -7367,9 +7383,9 @@ public:
|
|||||||
color.desc.view_info.type == vk::ImageViewType::e2D &&
|
color.desc.view_info.type == vk::ImageViewType::e2D &&
|
||||||
color.desc.view_info.base_layer == 5 &&
|
color.desc.view_info.base_layer == 5 &&
|
||||||
color.desc.view_info.layer_count == 1 &&
|
color.desc.view_info.layer_count == 1 &&
|
||||||
(target_address & 0xffffu) == 0x4000 &&
|
(target_address & (tile_case.alignment - 1)) == 0 &&
|
||||||
image.usage.render_target && image.IsGpuModified(),
|
image.usage.render_target && image.IsGpuModified(),
|
||||||
"slice 5 Standard4KB render target was not resolved");
|
"slice 5 standard-tiled render target was not resolved");
|
||||||
|
|
||||||
RenderExecutorTestAccess::ResetBindings(executor);
|
RenderExecutorTestAccess::ResetBindings(executor);
|
||||||
resources.UnmapMemory(base, allocation_size);
|
resources.UnmapMemory(base, allocation_size);
|
||||||
@@ -7378,11 +7394,11 @@ public:
|
|||||||
|
|
||||||
Require(name, "unmap direct backing",
|
Require(name, "unmap direct backing",
|
||||||
Libs::LibKernel::Memory::KernelMunmap(base, allocation_size) == 0,
|
Libs::LibKernel::Memory::KernelMunmap(base, allocation_size) == 0,
|
||||||
"Standard4KB color mapping release failed");
|
"standard-tiled color mapping release failed");
|
||||||
Require(name, "release direct backing",
|
Require(name, "release direct backing",
|
||||||
Libs::LibKernel::Memory::KernelReleaseDirectMemory(
|
Libs::LibKernel::Memory::KernelReleaseDirectMemory(
|
||||||
direct_offset, allocation_size) == 0,
|
direct_offset, allocation_size) == 0,
|
||||||
"Standard4KB color allocation release failed");
|
"standard-tiled color allocation release failed");
|
||||||
std::printf("[gpu] %-32s ok\n", name);
|
std::printf("[gpu] %-32s ok\n", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24603,9 +24619,9 @@ int main(int argc, char **argv) {
|
|||||||
CheckStandard64RenderTargetTileRoundTrip();
|
CheckStandard64RenderTargetTileRoundTrip();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (argc == 2 && std::strcmp(argv[1], "--standard4-rt-only") == 0) {
|
if (argc == 2 && std::strcmp(argv[1], "--standard-tile-rt-only") == 0) {
|
||||||
VulkanHarness vulkan;
|
VulkanHarness vulkan;
|
||||||
vulkan.CheckRenderExecutorColorStandard4TileDiscovery();
|
vulkan.CheckRenderExecutorColorStandardTileDiscovery();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (argc == 2 && std::strcmp(argv[1], "--image-view-only") == 0) {
|
if (argc == 2 && std::strcmp(argv[1], "--image-view-only") == 0) {
|
||||||
@@ -24726,7 +24742,7 @@ int main(int argc, char **argv) {
|
|||||||
#if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS
|
#if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS
|
||||||
vulkan.CheckRenderExecutorColor1DDiscovery();
|
vulkan.CheckRenderExecutorColor1DDiscovery();
|
||||||
vulkan.CheckRenderExecutorColorVolumeDiscovery();
|
vulkan.CheckRenderExecutorColorVolumeDiscovery();
|
||||||
vulkan.CheckRenderExecutorColorStandard4TileDiscovery();
|
vulkan.CheckRenderExecutorColorStandardTileDiscovery();
|
||||||
vulkan.CheckRenderExecutorColorDepthTileDiscovery();
|
vulkan.CheckRenderExecutorColorDepthTileDiscovery();
|
||||||
vulkan.CheckRenderExecutorStencilBindingDiscovery();
|
vulkan.CheckRenderExecutorStencilBindingDiscovery();
|
||||||
vulkan.CheckUnifiedTextureCacheFlow();
|
vulkan.CheckUnifiedTextureCacheFlow();
|
||||||
|
|||||||
Reference in New Issue
Block a user