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) {
|
if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::FmaskDecompress) {
|
||||||
// TODO: check for a valid MRT1 to promote the draw to the resolve pass.
|
// TODO: check for a valid MRT1 to promote the draw to the resolve pass.
|
||||||
LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped");
|
LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped");
|
||||||
|
ScopedMarkerInsert("FmaskDecompress");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::Resolve) {
|
if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::Resolve) {
|
||||||
@ -67,6 +68,7 @@ bool Rasterizer::FilterDraw() {
|
|||||||
}
|
}
|
||||||
if (regs.primitive_type == AmdGpu::PrimitiveType::None) {
|
if (regs.primitive_type == AmdGpu::PrimitiveType::None) {
|
||||||
LOG_TRACE(Render_Vulkan, "Primitive type 'None' skipped");
|
LOG_TRACE(Render_Vulkan, "Primitive type 'None' skipped");
|
||||||
|
ScopedMarkerInsert("PrimitiveTypeNone");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,10 +246,13 @@ void Rasterizer::EliminateFastClear() {
|
|||||||
.layerCount = col_buf.view.slice_max - col_buf.view.slice_start + 1,
|
.layerCount = col_buf.view.slice_max - col_buf.view.slice_start + 1,
|
||||||
};
|
};
|
||||||
scheduler.EndRendering();
|
scheduler.EndRendering();
|
||||||
|
ScopeMarkerBegin(fmt::format("EliminateFastClear:MRT={:#x}:M={:#x}", col_buf.Address(),
|
||||||
|
col_buf.CmaskAddress()));
|
||||||
image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {});
|
image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {});
|
||||||
scheduler.CommandBuffer().clearColorImage(image.image, image.last_state.layout,
|
scheduler.CommandBuffer().clearColorImage(image.image, image.last_state.layout,
|
||||||
LiverpoolToVK::ColorBufferClearValue(col_buf).color,
|
LiverpoolToVK::ColorBufferClearValue(col_buf).color,
|
||||||
range);
|
range);
|
||||||
|
ScopeMarkerEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
|
void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
|
||||||
@ -842,8 +847,6 @@ void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& s
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Rasterizer::Resolve() {
|
void Rasterizer::Resolve() {
|
||||||
const auto cmdbuf = scheduler.CommandBuffer();
|
|
||||||
|
|
||||||
// Read from MRT0, average all samples, and write to MRT1, which is one-sample
|
// 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& mrt0_hint = liverpool->last_cb_extent[0];
|
||||||
const auto& mrt1_hint = liverpool->last_cb_extent[1];
|
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.base.layer = liverpool->regs.color_buffers[1].view.slice_start;
|
||||||
mrt1_range.extent.layers = liverpool->regs.color_buffers[1].NumSlices() - mrt1_range.base.layer;
|
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_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead,
|
||||||
mrt0_range);
|
mrt0_range);
|
||||||
|
|
||||||
mrt1_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite,
|
mrt1_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite,
|
||||||
mrt1_range);
|
mrt1_range);
|
||||||
|
|
||||||
@ -892,8 +898,9 @@ void Rasterizer::Resolve() {
|
|||||||
.dstOffset = {0, 0, 0},
|
.dstOffset = {0, 0, 0},
|
||||||
.extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1},
|
.extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1},
|
||||||
};
|
};
|
||||||
cmdbuf.copyImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, mrt1_image.image,
|
scheduler.CommandBuffer().copyImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal,
|
||||||
vk::ImageLayout::eTransferDstOptimal, region);
|
mrt1_image.image, vk::ImageLayout::eTransferDstOptimal,
|
||||||
|
region);
|
||||||
} else {
|
} else {
|
||||||
vk::ImageResolve region = {
|
vk::ImageResolve region = {
|
||||||
.srcSubresource =
|
.srcSubresource =
|
||||||
@ -914,9 +921,12 @@ void Rasterizer::Resolve() {
|
|||||||
.dstOffset = {0, 0, 0},
|
.dstOffset = {0, 0, 0},
|
||||||
.extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1},
|
.extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1},
|
||||||
};
|
};
|
||||||
cmdbuf.resolveImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal,
|
scheduler.CommandBuffer().resolveImage(
|
||||||
mrt1_image.image, vk::ImageLayout::eTransferDstOptimal, region);
|
mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, mrt1_image.image,
|
||||||
|
vk::ImageLayout::eTransferDstOptimal, region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScopeMarkerEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) {
|
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.base.layer = liverpool->regs.depth_view.slice_start;
|
||||||
sub_range.extent.layers = liverpool->regs.depth_view.NumSlices() - sub_range.base.layer;
|
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,
|
read_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead,
|
||||||
sub_range);
|
sub_range);
|
||||||
write_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite,
|
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},
|
.dstOffset = {0, 0, 0},
|
||||||
.extent = {write_image.info.size.width, write_image.info.size.height, 1},
|
.extent = {write_image.info.size.width, write_image.info.size.height, 1},
|
||||||
};
|
};
|
||||||
const auto cmdbuf = scheduler.CommandBuffer();
|
scheduler.CommandBuffer().copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal,
|
||||||
cmdbuf.copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal, write_image.image,
|
write_image.image, vk::ImageLayout::eTransferDstOptimal,
|
||||||
vk::ImageLayout::eTransferDstOptimal, region);
|
region);
|
||||||
|
|
||||||
|
ScopeMarkerEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rasterizer::InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds) {
|
void Rasterizer::InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds) {
|
||||||
|
Loading…
Reference in New Issue
Block a user