mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-08 10:21:40 +00:00
[vulkan] Fix some more sync validation errors
These were a little harder to find, especially the lighting ones.
This commit is contained in:
parent
61e6332473
commit
b632d1dc52
3 changed files with 56 additions and 27 deletions
|
@ -843,9 +843,18 @@ lighting_update_lights (const exprval_t **params, exprval_t *result,
|
|||
memcpy (eids + queue[i].start, entids[i],
|
||||
sizeof (uint32_t[queue[i].count]));
|
||||
}
|
||||
auto ir_barrier = &bufferBarriers[qfv_BB_TransferWrite_to_IndexRead];
|
||||
QFV_PacketScatterBuffer (packet, lframe->entid_buffer, 1, &eid_scatter,
|
||||
ir_barrier);
|
||||
&(qfv_bufferbarrier_t) {
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
|
||||
.barrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
},
|
||||
});
|
||||
|
||||
memset (lframe->id_radius, -1, MaxLights * sizeof (light_idrad_t));
|
||||
for (int i = 0; i < ST_COUNT; i++) {
|
||||
|
@ -1077,7 +1086,6 @@ lighting_rewrite_ids (lightingframe_t *lframe, vulkan_ctx_t *ctx)
|
|||
return;
|
||||
}
|
||||
|
||||
auto bb = &bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
|
||||
auto packet = QFV_PacketAcquire (ctx->staging);
|
||||
byte *packet_start = QFV_PacketExtend (packet, packet_size);
|
||||
byte *packet_data = packet_start;
|
||||
|
@ -1113,12 +1121,38 @@ lighting_rewrite_ids (lightingframe_t *lframe, vulkan_ctx_t *ctx)
|
|||
enqueue_map (matrix_ids, lframe, r);
|
||||
}
|
||||
|
||||
static qfv_bufferbarrier_t vtxattr_read = {
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
|
||||
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.barrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
|
||||
| VK_ACCESS_SHADER_READ_BIT,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
},
|
||||
};
|
||||
static qfv_bufferbarrier_t storage_read = {
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.barrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
},
|
||||
};
|
||||
|
||||
QFV_PacketScatterBuffer (packet, lframe->id_buffer, 1, &id_scatter,
|
||||
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
|
||||
&vtxattr_read);
|
||||
QFV_PacketScatterBuffer (packet, lframe->radius_buffer, 1, &radius_scatter,
|
||||
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
|
||||
&vtxattr_read);
|
||||
QFV_PacketScatterBuffer (packet, lframe->shadowmat_id_buffer,
|
||||
1, &matrix_id_scater, bb);
|
||||
1, &matrix_id_scater, &storage_read);
|
||||
|
||||
QFV_PacketSubmit (packet);
|
||||
transition_shadow_targets (lframe, ctx);
|
||||
|
|
|
@ -131,8 +131,6 @@ update_matrices (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
|
|||
qfZoneNamed (zone, true);
|
||||
auto taskctx = (qfv_taskctx_t *) ectx;
|
||||
auto ctx = taskctx->ctx;
|
||||
auto device = ctx->device;
|
||||
auto dfunc = device->funcs;
|
||||
auto mctx = ctx->matrix_context;
|
||||
auto mframe = &mctx->frames.a[ctx->curFrame];
|
||||
|
||||
|
@ -150,23 +148,9 @@ update_matrices (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
|
|||
qfv_matrix_buffer_t *m = QFV_PacketExtend (packet, sizeof (*m));
|
||||
*m = mctx->matrices;
|
||||
|
||||
qfv_bufferbarrier_t bb = bufferBarriers[qfv_BB_Unknown_to_TransferWrite]; bb.barrier.buffer = mframe->buffer;
|
||||
bb.barrier.size = packet->length;
|
||||
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, bb.srcStages, bb.dstStages,
|
||||
0, 0, 0, 1, &bb.barrier, 0, 0);
|
||||
|
||||
VkBufferCopy copy_region = { packet->offset, 0, packet->length };
|
||||
dfunc->vkCmdCopyBuffer (packet->cmd, mctx->stage->buffer,
|
||||
mframe->buffer, 1, ©_region);
|
||||
|
||||
bb = bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
|
||||
bb.barrier.buffer = mframe->buffer;
|
||||
bb.barrier.size = packet->length;
|
||||
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, bb.srcStages, bb.dstStages,
|
||||
0, 0, 0, 1, &bb.barrier, 0, 0);
|
||||
|
||||
auto bb = bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
|
||||
bb.dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
||||
QFV_PacketCopyBuffer (packet, mframe->buffer, 0, &bb);
|
||||
QFV_PacketSubmit (packet);
|
||||
}
|
||||
|
||||
|
|
|
@ -186,8 +186,19 @@ clear_translucent (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
|
|||
qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging);
|
||||
qfv_transtate_t *state = QFV_PacketExtend (packet, 2 * sizeof (*state));
|
||||
*state = (qfv_transtate_t) { 0, tctx->maxFragments };
|
||||
auto bb = &bufferBarriers[qfv_BB_TransferWrite_to_ShaderRW];
|
||||
QFV_PacketCopyBuffer (packet, tframe->state->buffer.buffer, 0, bb);
|
||||
QFV_PacketCopyBuffer (packet, tframe->state->buffer.buffer, 0,
|
||||
&(qfv_bufferbarrier_t) {
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.barrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT
|
||||
| VK_ACCESS_SHADER_WRITE_BIT,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
},
|
||||
});
|
||||
QFV_PacketSubmit (packet);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue