barriers simplified
This commit is contained in:
parent
0b6c1ad618
commit
8df22335cb
|
@ -518,6 +518,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PM4ItOpcode::PfpSyncMe: {
|
case PM4ItOpcode::PfpSyncMe: {
|
||||||
|
rasterizer->CpSync();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -29,6 +29,19 @@ Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_,
|
||||||
|
|
||||||
Rasterizer::~Rasterizer() = default;
|
Rasterizer::~Rasterizer() = default;
|
||||||
|
|
||||||
|
void Rasterizer::CpSync() {
|
||||||
|
scheduler.EndRendering();
|
||||||
|
auto cmdbuf = scheduler.CommandBuffer();
|
||||||
|
|
||||||
|
const vk::MemoryBarrier ib_barrier{
|
||||||
|
.srcAccessMask = vk::AccessFlagBits::eShaderWrite,
|
||||||
|
.dstAccessMask = vk::AccessFlagBits::eIndirectCommandRead,
|
||||||
|
};
|
||||||
|
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eComputeShader,
|
||||||
|
vk::PipelineStageFlagBits::eDrawIndirect,
|
||||||
|
vk::DependencyFlagBits::eByRegion, ib_barrier, {}, {});
|
||||||
|
}
|
||||||
|
|
||||||
void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
|
void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
|
||||||
RENDERER_TRACE;
|
RENDERER_TRACE;
|
||||||
|
|
||||||
|
@ -95,18 +108,6 @@ void Rasterizer::DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 si
|
||||||
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
|
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
|
||||||
const auto total_offset = base + offset;
|
const auto total_offset = base + offset;
|
||||||
|
|
||||||
// Emulate PFP-to-ME sync packet
|
|
||||||
const vk::BufferMemoryBarrier ib_barrier{
|
|
||||||
.srcAccessMask = vk::AccessFlagBits::eShaderWrite,
|
|
||||||
.dstAccessMask = vk::AccessFlagBits::eIndirectCommandRead,
|
|
||||||
.buffer = buffer->Handle(),
|
|
||||||
.offset = total_offset,
|
|
||||||
.size = size,
|
|
||||||
};
|
|
||||||
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eComputeShader,
|
|
||||||
vk::PipelineStageFlagBits::eDrawIndirect,
|
|
||||||
vk::DependencyFlagBits::eByRegion, {}, ib_barrier, {});
|
|
||||||
|
|
||||||
// We can safely ignore both SGPR UD indices and results of fetch shader parsing, as vertex and
|
// We can safely ignore both SGPR UD indices and results of fetch shader parsing, as vertex and
|
||||||
// instance offsets will be automatically applied by Vulkan from indirect args buffer.
|
// instance offsets will be automatically applied by Vulkan from indirect args buffer.
|
||||||
|
|
||||||
|
@ -164,19 +165,6 @@ void Rasterizer::DispatchIndirect(VAddr address, u32 offset, u32 size) {
|
||||||
cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline->Handle());
|
cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline->Handle());
|
||||||
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
|
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
|
||||||
const auto total_offset = base + offset;
|
const auto total_offset = base + offset;
|
||||||
|
|
||||||
// Emulate PFP-to-ME sync packet
|
|
||||||
const vk::BufferMemoryBarrier ib_barrier{
|
|
||||||
.srcAccessMask = vk::AccessFlagBits::eShaderWrite,
|
|
||||||
.dstAccessMask = vk::AccessFlagBits::eIndirectCommandRead,
|
|
||||||
.buffer = buffer->Handle(),
|
|
||||||
.offset = total_offset,
|
|
||||||
.size = size,
|
|
||||||
};
|
|
||||||
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eComputeShader,
|
|
||||||
vk::PipelineStageFlagBits::eDrawIndirect,
|
|
||||||
vk::DependencyFlagBits::eByRegion, {}, ib_barrier, {});
|
|
||||||
|
|
||||||
cmdbuf.dispatchIndirect(buffer->Handle(), total_offset);
|
cmdbuf.dispatchIndirect(buffer->Handle(), total_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ public:
|
||||||
void MapMemory(VAddr addr, u64 size);
|
void MapMemory(VAddr addr, u64 size);
|
||||||
void UnmapMemory(VAddr addr, u64 size);
|
void UnmapMemory(VAddr addr, u64 size);
|
||||||
|
|
||||||
|
void CpSync();
|
||||||
u64 Flush();
|
u64 Flush();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in New Issue