mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 13:56:59 +01:00
Centralize attachment sample validation before acquisition
This commit is contained in:
@@ -461,7 +461,6 @@ RenderState RenderExecutor::AcquireRenderTargets(CommandBuffer& buffer, RenderCo
|
|||||||
state.height = std::numeric_limits<uint32_t>::max();
|
state.height = std::numeric_limits<uint32_t>::max();
|
||||||
state.num_layers = std::numeric_limits<uint32_t>::max();
|
state.num_layers = std::numeric_limits<uint32_t>::max();
|
||||||
state.num_color_attachments = 0;
|
state.num_color_attachments = 0;
|
||||||
uint32_t attachment_samples = 0;
|
|
||||||
for (uint32_t i = 0; i < color_count; i++) {
|
for (uint32_t i = 0; i < color_count; i++) {
|
||||||
auto& target = colors[i];
|
auto& target = colors[i];
|
||||||
EXIT_IF(!target.image_id);
|
EXIT_IF(!target.image_id);
|
||||||
@@ -482,12 +481,6 @@ RenderState RenderExecutor::AcquireRenderTargets(CommandBuffer& buffer, RenderCo
|
|||||||
target.desc.view_info.base_level, target.desc.view_info.base_layer,
|
target.desc.view_info.base_level, target.desc.view_info.base_layer,
|
||||||
target.desc.view_info.layer_count);
|
target.desc.view_info.layer_count);
|
||||||
EXIT_IF(image.backing.samples != target.desc.info.samples || image_view == nullptr);
|
EXIT_IF(image.backing.samples != target.desc.info.samples || image_view == nullptr);
|
||||||
if (attachment_samples == 0) {
|
|
||||||
attachment_samples = target.desc.info.samples;
|
|
||||||
} else if (attachment_samples != target.desc.info.samples) {
|
|
||||||
EXIT("mixed color attachment sample counts are unsupported: %u and %u\n",
|
|
||||||
attachment_samples, target.desc.info.samples);
|
|
||||||
}
|
|
||||||
const auto& view = target.desc.view_info;
|
const auto& view = target.desc.view_info;
|
||||||
const auto layout = image.binding.is_bound ? vk::ImageLayout::eGeneral
|
const auto layout = image.binding.is_bound ? vk::ImageLayout::eGeneral
|
||||||
: vk::ImageLayout::eColorAttachmentOptimal;
|
: vk::ImageLayout::eColorAttachmentOptimal;
|
||||||
@@ -536,12 +529,6 @@ RenderState RenderExecutor::AcquireRenderTargets(CommandBuffer& buffer, RenderCo
|
|||||||
image.info.data.address, depth.desc.view_info.base_layer,
|
image.info.data.address, depth.desc.view_info.base_layer,
|
||||||
depth.desc.view_info.layer_count);
|
depth.desc.view_info.layer_count);
|
||||||
EXIT_IF(image_view == nullptr || image.backing.samples != depth.desc.info.samples);
|
EXIT_IF(image_view == nullptr || image.backing.samples != depth.desc.info.samples);
|
||||||
if (attachment_samples == 0) {
|
|
||||||
attachment_samples = depth.desc.info.samples;
|
|
||||||
} else if (attachment_samples != depth.desc.info.samples) {
|
|
||||||
EXIT("mixed color/depth sample counts are unsupported: %u and %u\n", attachment_samples,
|
|
||||||
depth.desc.info.samples);
|
|
||||||
}
|
|
||||||
const bool feedback = depth.depth_write_enable && pixel &&
|
const bool feedback = depth.depth_write_enable && pixel &&
|
||||||
std::ranges::any_of(pixel->images, [&](const TextureBinding& binding) {
|
std::ranges::any_of(pixel->images, [&](const TextureBinding& binding) {
|
||||||
if (binding.image_id != depth.image_id ||
|
if (binding.image_id != depth.image_id ||
|
||||||
@@ -592,9 +579,6 @@ RenderState RenderExecutor::AcquireRenderTargets(CommandBuffer& buffer, RenderCo
|
|||||||
const auto& limits = buffer.GetGraphics().GetPhysicalDeviceProperties().limits;
|
const auto& limits = buffer.GetGraphics().GetPhysicalDeviceProperties().limits;
|
||||||
state.width = limits.maxFramebufferWidth;
|
state.width = limits.maxFramebufferWidth;
|
||||||
state.height = limits.maxFramebufferHeight;
|
state.height = limits.maxFramebufferHeight;
|
||||||
} else if (attachment_samples == 0 ||
|
|
||||||
vulkan_sample_count(attachment_samples) == vk::SampleCountFlagBits {}) {
|
|
||||||
EXIT("render state has no valid attachments\n");
|
|
||||||
}
|
}
|
||||||
if (state.num_layers == std::numeric_limits<uint32_t>::max()) {
|
if (state.num_layers == std::numeric_limits<uint32_t>::max()) {
|
||||||
state.num_layers = 1;
|
state.num_layers = 1;
|
||||||
@@ -1109,10 +1093,6 @@ void RenderExecutor::ExecutePreparedDraw(uint64_t submit_id, CommandBuffer& buff
|
|||||||
vertex_bindings = AcquireVertexBuffers(buffer, state.vertex_info[0]);
|
vertex_bindings = AcquireVertexBuffers(buffer, state.vertex_info[0]);
|
||||||
index_binding = PrepareIndexBuffer(buffer, index_source);
|
index_binding = PrepareIndexBuffer(buffer, index_source);
|
||||||
}
|
}
|
||||||
const auto rendering =
|
|
||||||
AcquireRenderTargets(buffer, state.color_info, state.color_count, state.depth_info,
|
|
||||||
bindings.pixel);
|
|
||||||
|
|
||||||
if (draw.IsIndexed()) {
|
if (draw.IsIndexed()) {
|
||||||
LogDrawPhase(draw.Name(), "CreatePipeline");
|
LogDrawPhase(draw.Name(), "CreatePipeline");
|
||||||
}
|
}
|
||||||
@@ -1120,6 +1100,9 @@ void RenderExecutor::ExecutePreparedDraw(uint64_t submit_id, CommandBuffer& buff
|
|||||||
std::span {state.color_info, state.color_count}, state.depth_info, vertex_stages, buffer,
|
std::span {state.color_info, state.color_count}, state.depth_info, vertex_stages, buffer,
|
||||||
state.ps_active ? &state.ps_input_info : nullptr, topology, primitive_restart_enable,
|
state.ps_active ? &state.ps_input_info : nullptr, topology, primitive_restart_enable,
|
||||||
state.programs);
|
state.programs);
|
||||||
|
const auto rendering =
|
||||||
|
AcquireRenderTargets(buffer, state.color_info, state.color_count, state.depth_info,
|
||||||
|
bindings.pixel);
|
||||||
|
|
||||||
// Resource preparation above may synchronously finish and restart the scheduler. From this
|
// Resource preparation above may synchronously finish and restart the scheduler. From this
|
||||||
// point onward, every operation targets the current command buffer and cannot touch guest
|
// point onward, every operation targets the current command buffer and cannot touch guest
|
||||||
|
|||||||
Reference in New Issue
Block a user