[vulkan] Flush bsp vertex indices after all drawing

This commit is contained in:
Bill Currie 2021-12-17 15:52:17 +09:00
parent 36e98f013e
commit 869cc4050c
3 changed files with 23 additions and 11 deletions

View file

@ -170,6 +170,7 @@ void Vulkan_ClearElements (struct vulkan_ctx_s *ctx);
void Vulkan_DrawWorld (struct qfv_renderframe_s *rFrame); void Vulkan_DrawWorld (struct qfv_renderframe_s *rFrame);
void Vulkan_DrawSky (struct qfv_renderframe_s *rFrame); void Vulkan_DrawSky (struct qfv_renderframe_s *rFrame);
void Vulkan_DrawWaterSurfaces (struct qfv_renderframe_s *rFrame); void Vulkan_DrawWaterSurfaces (struct qfv_renderframe_s *rFrame);
void Vulkan_Bsp_Flush (struct vulkan_ctx_s *ctx);
void Vulkan_LoadSkys (const char *sky, struct vulkan_ctx_s *ctx); void Vulkan_LoadSkys (const char *sky, struct vulkan_ctx_s *ctx);
void Vulkan_RegisterTextures (model_t **models, int num_models, void Vulkan_RegisterTextures (model_t **models, int num_models,
struct vulkan_ctx_s *ctx); struct vulkan_ctx_s *ctx);

View file

@ -1041,7 +1041,7 @@ build_tex_elechain (vulktex_t *tex, bspctx_t *bctx, bspframe_t *bframe)
elements_t *el = 0; elements_t *el = 0;
for (is = tex->tex_chain; is; is = is->tex_chain) { for (is = tex->tex_chain; is; is = is->tex_chain) {
// emit the polygon indices for the the surface to the texture's // emit the polygon indices for the surface to the texture's
// element chain // element chain
add_surf_elements (tex, is, &ec, &el, bctx, bframe); add_surf_elements (tex, is, &ec, &el, bctx, bframe);
} }
@ -1110,7 +1110,15 @@ Vulkan_DrawWorld (qfv_renderframe_t *rFrame)
tex->elechain_tail = &tex->elechain; tex->elechain_tail = &tex->elechain;
} }
bsp_end (ctx); bsp_end (ctx);
}
void
Vulkan_Bsp_Flush (vulkan_ctx_t *ctx)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
bspctx_t *bctx = ctx->bsp_context;
bspframe_t *bframe = &bctx->frames.a[ctx->curFrame];
size_t atom = device->physDev->properties.limits.nonCoherentAtomSize; size_t atom = device->physDev->properties.limits.nonCoherentAtomSize;
size_t atom_mask = atom - 1; size_t atom_mask = atom - 1;
size_t offset = bframe->index_offset; size_t offset = bframe->index_offset;
@ -1119,7 +1127,6 @@ Vulkan_DrawWorld (qfv_renderframe_t *rFrame)
offset &= ~atom_mask; offset &= ~atom_mask;
size = (size + atom_mask) & ~atom_mask; size = (size + atom_mask) & ~atom_mask;
//FIXME this needs to come at the end of the frame after all passes
VkMappedMemoryRange range = { VkMappedMemoryRange range = {
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, 0, VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, 0,
bctx->index_memory, offset, size bctx->index_memory, offset, size
@ -1165,7 +1172,7 @@ Vulkan_DrawWaterSurfaces (qfv_renderframe_t *rFrame)
} }
tex = surf->texinfo->texture->render; tex = surf->texinfo->texture->render;
} }
// emit the polygon indices for the the surface to the texture's // emit the polygon indices for the surface to the texture's
// element chain // element chain
add_surf_elements (tex, is, &ec, &el, bctx, bframe); add_surf_elements (tex, is, &ec, &el, bctx, bframe);
} }
@ -1227,7 +1234,7 @@ Vulkan_DrawSky (qfv_renderframe_t *rFrame)
} }
tex = surf->texinfo->texture->render; tex = surf->texinfo->texture->render;
} }
// emit the polygon indices for the the surface to the texture's // emit the polygon indices for the surface to the texture's
// element chain // element chain
add_surf_elements (tex, is, &ec, &el, bctx, bframe); add_surf_elements (tex, is, &ec, &el, bctx, bframe);
} }

View file

@ -131,7 +131,7 @@ void
Vulkan_RenderView (qfv_renderframe_t *rFrame) Vulkan_RenderView (qfv_renderframe_t *rFrame)
{ {
vulkan_ctx_t *ctx = rFrame->vulkan_ctx; vulkan_ctx_t *ctx = rFrame->vulkan_ctx;
double t[9] = {}; double t[10] = {};
int speeds = r_speeds->int_val; int speeds = r_speeds->int_val;
if (!r_worldentity.renderer.model) { if (!r_worldentity.renderer.model) {
@ -165,14 +165,18 @@ Vulkan_RenderView (qfv_renderframe_t *rFrame)
Vulkan_DrawParticles (ctx); Vulkan_DrawParticles (ctx);
if (speeds) if (speeds)
t[8] = Sys_DoubleTime (); t[8] = Sys_DoubleTime ();
Vulkan_Bsp_Flush (ctx);
if (speeds)
t[9] = Sys_DoubleTime ();
if (speeds) { if (speeds) {
double total = (t[9] - t[0]) * 1000;
for (int i = 0; i < 9; i++) {
t[i] = (t[i + 1] - t[i]) * 1000;
}
Sys_Printf ("frame: %g, setup: %g, mark: %g, pushdl: %g, world: %g," Sys_Printf ("frame: %g, setup: %g, mark: %g, pushdl: %g, world: %g,"
" sky: %g, ents: %g, water: %g, part: %g\n", " sky: %g, ents: %g, water: %g, flush: %g, part: %g\n",
(t[8] - t[0]) * 1000, (t[1] - t[0]) * 1000, total,
(t[2] - t[1]) * 1000, (t[3] - t[2]) * 1000, t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8]);
(t[4] - t[3]) * 1000, (t[5] - t[4]) * 1000,
(t[6] - t[5]) * 1000, (t[7] - t[6]) * 1000,
(t[8] - t[7]) * 1000);
} }
} }