mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-05 00:42:48 +00:00
vk_rasterizer: Add scopes around filtered draw passes.
This commit is contained in:
parent
5db09c7c90
commit
433d946b3f
@ -58,6 +58,7 @@ bool Rasterizer::FilterDraw() {
|
||||
if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::FmaskDecompress) {
|
||||
// TODO: check for a valid MRT1 to promote the draw to the resolve pass.
|
||||
LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped");
|
||||
ScopedMarkerInsert("FmaskDecompress");
|
||||
return false;
|
||||
}
|
||||
if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::Resolve) {
|
||||
@ -67,6 +68,7 @@ bool Rasterizer::FilterDraw() {
|
||||
}
|
||||
if (regs.primitive_type == AmdGpu::PrimitiveType::None) {
|
||||
LOG_TRACE(Render_Vulkan, "Primitive type 'None' skipped");
|
||||
ScopedMarkerInsert("PrimitiveTypeNone");
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -244,10 +246,13 @@ void Rasterizer::EliminateFastClear() {
|
||||
.layerCount = col_buf.view.slice_max - col_buf.view.slice_start + 1,
|
||||
};
|
||||
scheduler.EndRendering();
|
||||
ScopeMarkerBegin(fmt::format("EliminateFastClear:MRT={:#x}:M={:#x}", col_buf.Address(),
|
||||
col_buf.CmaskAddress()));
|
||||
image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {});
|
||||
scheduler.CommandBuffer().clearColorImage(image.image, image.last_state.layout,
|
||||
LiverpoolToVK::ColorBufferClearValue(col_buf).color,
|
||||
range);
|
||||
ScopeMarkerEnd();
|
||||
}
|
||||
|
||||
void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
|
||||
@ -842,8 +847,6 @@ void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& s
|
||||
}
|
||||
|
||||
void Rasterizer::Resolve() {
|
||||
const auto cmdbuf = scheduler.CommandBuffer();
|
||||
|
||||
// Read from MRT0, average all samples, and write to MRT1, which is one-sample
|
||||
const auto& mrt0_hint = liverpool->last_cb_extent[0];
|
||||
const auto& mrt1_hint = liverpool->last_cb_extent[1];
|
||||
@ -863,9 +866,12 @@ void Rasterizer::Resolve() {
|
||||
mrt1_range.base.layer = liverpool->regs.color_buffers[1].view.slice_start;
|
||||
mrt1_range.extent.layers = liverpool->regs.color_buffers[1].NumSlices() - mrt1_range.base.layer;
|
||||
|
||||
ScopeMarkerBegin(fmt::format("Resolve:MRT0={:#x}:MRT1={:#x}",
|
||||
liverpool->regs.color_buffers[0].Address(),
|
||||
liverpool->regs.color_buffers[1].Address()));
|
||||
|
||||
mrt0_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead,
|
||||
mrt0_range);
|
||||
|
||||
mrt1_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite,
|
||||
mrt1_range);
|
||||
|
||||
@ -892,8 +898,9 @@ void Rasterizer::Resolve() {
|
||||
.dstOffset = {0, 0, 0},
|
||||
.extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1},
|
||||
};
|
||||
cmdbuf.copyImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, mrt1_image.image,
|
||||
vk::ImageLayout::eTransferDstOptimal, region);
|
||||
scheduler.CommandBuffer().copyImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal,
|
||||
mrt1_image.image, vk::ImageLayout::eTransferDstOptimal,
|
||||
region);
|
||||
} else {
|
||||
vk::ImageResolve region = {
|
||||
.srcSubresource =
|
||||
@ -914,9 +921,12 @@ void Rasterizer::Resolve() {
|
||||
.dstOffset = {0, 0, 0},
|
||||
.extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1},
|
||||
};
|
||||
cmdbuf.resolveImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal,
|
||||
mrt1_image.image, vk::ImageLayout::eTransferDstOptimal, region);
|
||||
scheduler.CommandBuffer().resolveImage(
|
||||
mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, mrt1_image.image,
|
||||
vk::ImageLayout::eTransferDstOptimal, region);
|
||||
}
|
||||
|
||||
ScopeMarkerEnd();
|
||||
}
|
||||
|
||||
void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) {
|
||||
@ -936,6 +946,11 @@ void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) {
|
||||
sub_range.base.layer = liverpool->regs.depth_view.slice_start;
|
||||
sub_range.extent.layers = liverpool->regs.depth_view.NumSlices() - sub_range.base.layer;
|
||||
|
||||
ScopeMarkerBegin(fmt::format(
|
||||
"DepthStencilCopy:DR={:#x}:SR={:#x}:DW={:#x}:SW={:#x}", regs.depth_buffer.DepthAddress(),
|
||||
regs.depth_buffer.StencilAddress(), regs.depth_buffer.DepthWriteAddress(),
|
||||
regs.depth_buffer.StencilWriteAddress()));
|
||||
|
||||
read_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead,
|
||||
sub_range);
|
||||
write_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite,
|
||||
@ -967,9 +982,11 @@ void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) {
|
||||
.dstOffset = {0, 0, 0},
|
||||
.extent = {write_image.info.size.width, write_image.info.size.height, 1},
|
||||
};
|
||||
const auto cmdbuf = scheduler.CommandBuffer();
|
||||
cmdbuf.copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal, write_image.image,
|
||||
vk::ImageLayout::eTransferDstOptimal, region);
|
||||
scheduler.CommandBuffer().copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal,
|
||||
write_image.image, vk::ImageLayout::eTransferDstOptimal,
|
||||
region);
|
||||
|
||||
ScopeMarkerEnd();
|
||||
}
|
||||
|
||||
void Rasterizer::InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds) {
|
||||
|
Loading…
Reference in New Issue
Block a user