count vk calls

This commit is contained in:
Denis Pauk 2024-12-27 17:32:15 +02:00
parent bb17105d53
commit 9d0732b2da
9 changed files with 119 additions and 3 deletions

View file

@ -343,6 +343,7 @@ qboolean Vkimp_CreateSurface(SDL_Window *window);
extern mvtx_t *verts_buffer;
extern uint16_t *vertIdxData;
extern int drawCalls;
void Mesh_Init (void);
void Mesh_Free (void);

View file

@ -2201,6 +2201,7 @@ VkResult QVk_BeginFrame(const VkViewport* viewport, const VkRect2D* scissor)
ReleaseSwapBuffers();
// VK_ERROR: Validation Error: [ VUID-vkAcquireNextImageKHR-semaphore-01779 ] Object 0: handle = 0x620000000062, name = Semaphore: image available #30, type = VK_OBJECT_TYPE_SEMAPHORE; | MessageID = 0x5717e75b | vkAcquireNextImageKHR(): Semaphore must not have any pending operations. The Vulkan spec states: If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending (https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-01779) (validation)
VkResult result = vkAcquireNextImageKHR(vk_device.logical, vk_swapchain.sc, 500000000 /* 0.5 sec */,
vk_imageAvailableSemaphores[vk_imageSemaphoreIdx], VK_NULL_HANDLE, &vk_imageIndex);
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || result == VK_ERROR_SURFACE_LOST_KHR || result == VK_TIMEOUT)
@ -2722,6 +2723,7 @@ QVk_Draw2DCallsRender(void)
vkCmdBindIndexBuffer(vk_activeCmdbuffer,
vk_rectIbo.resource.buffer, vk_rectIboffet, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, 6 * draw2dcolor_num, 1, 0, 0, 0);
printf("%d: %s Color\n", drawCalls++, __func__);
}
else if (draw2dcolor_calltype == CALL_TEX)
{
@ -2763,6 +2765,7 @@ QVk_Draw2DCallsRender(void)
vkCmdBindIndexBuffer(vk_activeCmdbuffer,
vk_rectIbo.resource.buffer, vk_rectIboffet, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, 6 * draw2dcolor_num, 1, 0, 0, 0);
printf("%d: %s Tex\n", drawCalls++, __func__);
}
draw2dcolor_num = 0;

View file

@ -390,8 +390,12 @@ static void ChangeColorBufferLayout(VkImage image, VkImageLayout fromLayout, VkI
.image = image,
.subresourceRange = subresourceRange,
};
/*
* VK_WARNING: Validation Warning: [ BestPractices-TransitionUndefinedToReadOnly ] Object 0: handle = 0x1a000000001a, type = VK_OBJECT_TYPE_IMAGE; | MessageID = 0xe10fe22f | vkCmdPipelineBarrier(): pImageMemoryBarriers[0] VkImageMemoryBarrier is being submitted with oldLayout VK_IMAGE_LAYOUT_UNDEFINED and the contents may be discarded, but the newLayout is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, which is read only. (validation)
*/
vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0u, 0u, NULL, 0u, NULL, 1u, &imageBarrier);
vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0u, 0u, NULL, 0u, NULL, 1u, &imageBarrier);
QVk_SubmitCommand(&commandBuffer, &vk_device.transferQueue);
vkFreeCommandBuffers(vk_device.logical, vk_transferCommandPool, 1, &commandBuffer);

View file

@ -85,6 +85,7 @@ R_RenderDlight(dlight_t *light)
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawDLightPipeline.layout, 0, 1, &uboDescriptorSet, 1, &uboOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, 48, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
void

View file

@ -234,6 +234,7 @@ R_DrawSpriteModel(entity_t *currententity, const model_t *currentmodel)
vk_drawSpritePipeline.layout, 0, 1,
&skin->vk_texture.descriptorSet, 0, NULL);
vkCmdDraw(vk_activeCmdbuffer, 6, 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
static void
@ -312,6 +313,7 @@ R_DrawNullModel(entity_t *currententity)
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, 24, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
static void
@ -528,6 +530,7 @@ Vk_DrawParticles(int num_particles, const particle_t particles[])
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdDraw(vk_activeCmdbuffer, (currentvertex - visibleParticles), 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
static void
@ -598,6 +601,7 @@ R_DrawParticles(void)
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawPointParticlesPipeline.layout, 0, 1, &uboDescriptorSet, 1, &uboOffset);
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdDraw(vk_activeCmdbuffer, r_newrefdef.num_particles, 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
else
{
@ -980,7 +984,7 @@ RE_RenderView(refdef_t *fd)
R_DrawAlphaSurfaces();
R_Flash();
R_Flash(); /* citadel error */
if (r_speeds->value)
{
@ -1051,6 +1055,7 @@ qboolean RE_EndWorldRenderpass(void)
vkCmdSetViewport(vk_activeCmdbuffer, 0u, 1u, &vk_viewport);
vkCmdSetScissor(vk_activeCmdbuffer, 0u, 1u, &vk_scissor);
vkCmdDraw(vk_activeCmdbuffer, 3, 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
vkCmdEndRenderPass(vk_activeCmdbuffer);
// start drawing UI
@ -1081,6 +1086,7 @@ R_SetVulkan2D(const VkViewport* viewport, const VkRect2D* scissor)
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_postprocessPipeline.layout, 0, 1, &vk_colorbufferWarp.descriptorSet, 0, NULL);
QVk_BindPipeline(&vk_postprocessPipeline);
vkCmdDraw(vk_activeCmdbuffer, 3, 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
}
@ -1436,6 +1442,8 @@ RE_BeginFrame(float camera_separation)
QVk_BeginRenderpass(RP_WORLD);
}
int drawCalls = 0;
/*
=====================
RE_EndFrame
@ -1448,6 +1456,9 @@ RE_EndFrame(void)
// world has not rendered yet
world_rendered = false;
printf("%s: Calls count %d\n", __func__, drawCalls);
drawCalls = 0;
}
unsigned r_rawpalette[256];
@ -1569,6 +1580,7 @@ R_DrawBeam(entity_t *currententity )
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawBeamPipeline.layout, 0, 1, &uboDescriptorSet, 1, &uboOffset);
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdDraw(vk_activeCmdbuffer, NUM_BEAM_SEGS * 4, 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
//===================================================================

View file

@ -411,6 +411,7 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
vkCmdBindIndexBuffer(vk_activeCmdbuffer, **buffer, *dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, *index_pos, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
static void
@ -850,5 +851,6 @@ R_DrawAliasModel(entity_t *currententity, const model_t *currentmodel)
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, index_pos, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
}

View file

@ -89,6 +89,7 @@ DrawVkPoly(msurface_t *fa, image_t *texture, const float *color)
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, (p->numverts - 2) * 3, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
static void
@ -145,6 +146,7 @@ R_DrawTriangleOutlines(void)
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdDraw(vk_activeCmdbuffer, 4, 1, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
}
}
@ -466,6 +468,7 @@ Vk_RenderLightmappedPoly(msurface_t *surf, float alpha,
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, index_pos, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
//PGM
//==========
}

View file

@ -156,6 +156,7 @@ EmitWaterPolys(msurface_t *fa, image_t *texture, const float *modelMatrix,
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, index_pos, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
void
@ -261,6 +262,7 @@ R_DrawSkyBox(void)
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, 6, 1, 0, 0, 0);
printf("%d: %s\n", drawCalls++, __func__);
}
}

View file

@ -1477,6 +1477,10 @@ SP_target_earthquake(edict_t *self)
*
* ReRelease: Creates a camera path as seen in the N64 version.
*/
#define HACKFLAG_TELEPORT_OUT 2
#define HACKFLAG_SKIPPABLE 64
#define HACKFLAG_END_OF_UNIT 128
static void
camera_lookat_pathtarget(edict_t* self, vec3_t origin, vec3_t* dest)
{
@ -1514,14 +1518,53 @@ camera_lookat_pathtarget(edict_t* self, vec3_t origin, vec3_t* dest)
void
update_target_camera_think(edict_t *self)
{
if (self->movetarget)
qboolean do_skip = false;
#if ORIGIN_CODE
/* only allow skipping after 2 seconds */
if ((self->hackflags & HACKFLAG_SKIPPABLE) && level.time > 2)
{
int i;
for (i = 0; i < game.maxclients; i++)
{
edict_t *client = g_edicts + 1 + i;
if (!client->inuse || !client->client->pers.connected)
{
continue;
}
if (client->client->buttons & BUTTON_ANY)
{
do_skip = true;
break;
}
}
}
#endif // ORIGIN_CODE
if (!do_skip && self->movetarget)
{
self->moveinfo.remaining_distance -= (self->moveinfo.move_speed * FRAMETIME) * 0.8f;
if(self->moveinfo.remaining_distance <= 0)
{
#if ORIGIN_CODE
if (self->movetarget->hackflags & HACKFLAG_TELEPORT_OUT)
{
if (self->enemy)
{
self->enemy->s.event = EV_PLAYER_TELEPORT;
self->enemy->hackflags = HACKFLAG_TELEPORT_OUT;
self->enemy->pain_debounce_time = self->enemy->timestamp = self->movetarget->wait;
}
}
#endif // ORIGIN_CODE
VectorCopy(self->movetarget->s.origin, self->s.origin);
self->nextthink = level.time + self->movetarget->wait;
if (self->movetarget->target)
{
self->movetarget = G_PickTarget(self->movetarget->target);
@ -1551,6 +1594,13 @@ update_target_camera_think(edict_t *self)
frac = 1.0f - (self->moveinfo.remaining_distance / self->moveinfo.distance);
#if ORIGIN_CODE
if (self->enemy && (self->enemy->hackflags & HACKFLAG_TELEPORT_OUT))
{
self->enemy->s.alpha = Q_max(1.f / 255.f, frac);
}
#endif // ORIGIN_CODE
VectorSubtract(self->movetarget->s.origin, self->s.origin, delta);
VectorScale(delta, frac, delta);
@ -1587,12 +1637,19 @@ update_target_camera_think(edict_t *self)
level.intermissiontime = 0;
#if ORIGIN_CODE
level.level_intermission_set = true;
#endif //ORIGIN_CODE
while ((t = G_Find(t, FOFS(targetname), self->killtarget)))
{
t->use(t, self, self->activator);
}
level.intermissiontime = level.time;
#if ORIGIN_CODE
level.intermission_server_frame = gi.ServerFrame();
#endif //ORIGIN_CODE
/* end of unit requires a wait */
if (level.changemap && !strchr(level.changemap, '*'))
@ -1621,6 +1678,15 @@ target_camera_dummy_think(edict_t *self)
self->velocity[1] * self->velocity[1]));
self->client = NULL;
#if ORIGIN_CODE
/* alpha fade out for voops */
if (self->hackflags & HACKFLAG_TELEPORT_OUT)
{
self->timestamp = Q_max(0, self->timestamp - FRAMETIME);
self->s.alpha = Q_max(1.f / 255.f, self->timestamp / self->pain_debounce_time);
}
#endif //ORIGIN_CODE
self->nextthink = level.time + FRAMETIME;
}
@ -1653,6 +1719,9 @@ use_target_camera(edict_t *self, edict_t *other, edict_t *activator)
}
level.intermissiontime = level.time;
#if ORIGIN_CODE
level.intermission_server_frame = gi.ServerFrame();
#endif //ORIGIN_CODE
level.exitintermission = 0;
/* spawn fake player dummy where we were */
@ -1696,6 +1765,18 @@ use_target_camera(edict_t *self, edict_t *other, edict_t *activator)
/* respawn any dead clients */
if (client->health <= 0)
{
#if ORIGIN_CODE
/*
* give us our max health back since it will reset
* to pers.health; in instanced items we'd lose the items
* we touched so we always want to respawn with our max.
*/
if (P_UseCoopInstancedItems())
{
client->client->pers.health = client->client->pers.max_health = client->max_health;
}
#endif //ORIGIN_CODE
respawn(client);
}
@ -1711,6 +1792,13 @@ use_target_camera(edict_t *self, edict_t *other, edict_t *activator)
self->moveinfo.remaining_distance = VectorNormalize(diff);
self->moveinfo.distance = self->moveinfo.remaining_distance;
#if ORIGIN_CODE
if (self->hackflags & HACKFLAG_END_OF_UNIT)
{
G_EndOfUnitMessage();
}
#endif //ORIGIN_CODE
}
void