mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-02-16 17:11:03 +00:00
vk: use single draw in Vk_RenderLightmappedPoly
This commit is contained in:
parent
a60ec01de9
commit
1a02a6423b
1 changed files with 98 additions and 165 deletions
|
@ -400,8 +400,9 @@ DrawTextureChains(entity_t *currententity)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Vk_RenderLightmappedPoly(msurface_t *surf, const float *modelMatrix, float alpha,
|
Vk_RenderLightmappedPoly(msurface_t *surf, float alpha,
|
||||||
const entity_t *currententity)
|
const entity_t *currententity, VkDescriptorSet *uboDescriptorSet,
|
||||||
|
uint32_t *uboOffset)
|
||||||
{
|
{
|
||||||
int i, nv = surf->polys->numverts;
|
int i, nv = surf->polys->numverts;
|
||||||
int map;
|
int map;
|
||||||
|
@ -410,29 +411,6 @@ Vk_RenderLightmappedPoly(msurface_t *surf, const float *modelMatrix, float alpha
|
||||||
unsigned lmtex = surf->lightmaptexturenum;
|
unsigned lmtex = surf->lightmaptexturenum;
|
||||||
mpoly_t *p;
|
mpoly_t *p;
|
||||||
|
|
||||||
struct {
|
|
||||||
float model[16];
|
|
||||||
float viewLightmaps;
|
|
||||||
} lmapPolyUbo;
|
|
||||||
|
|
||||||
lmapPolyUbo.viewLightmaps = r_lightmap->value ? 1.f : 0.f;
|
|
||||||
|
|
||||||
if (modelMatrix)
|
|
||||||
{
|
|
||||||
memcpy(lmapPolyUbo.model, modelMatrix, sizeof(float) * 16);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Mat_Identity(lmapPolyUbo.model);
|
|
||||||
}
|
|
||||||
|
|
||||||
QVk_BindPipeline(&vk_drawPolyLmapPipeline);
|
|
||||||
|
|
||||||
uint32_t uboOffset;
|
|
||||||
VkDescriptorSet uboDescriptorSet;
|
|
||||||
uint8_t *uboData = QVk_GetUniformBuffer(sizeof(lmapPolyUbo), &uboOffset, &uboDescriptorSet);
|
|
||||||
memcpy(uboData, &lmapPolyUbo, sizeof(lmapPolyUbo));
|
|
||||||
|
|
||||||
for (map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++)
|
for (map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++)
|
||||||
{
|
{
|
||||||
if (r_newrefdef.lightstyles[surf->styles[map]].white != surf->cached_light[map])
|
if (r_newrefdef.lightstyles[surf->styles[map]].white != surf->cached_light[map])
|
||||||
|
@ -457,14 +435,6 @@ Vk_RenderLightmappedPoly(msurface_t *surf, const float *modelMatrix, float alpha
|
||||||
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
|
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkDescriptorSet descriptorSets[] = {
|
|
||||||
image->vk_texture.descriptorSet,
|
|
||||||
uboDescriptorSet,
|
|
||||||
vk_state.lightmap_textures[lmtex].descriptorSet
|
|
||||||
};
|
|
||||||
|
|
||||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawPolyLmapPipeline.layout, 0, 3, descriptorSets, 1, &uboOffset);
|
|
||||||
|
|
||||||
if (is_dynamic)
|
if (is_dynamic)
|
||||||
{
|
{
|
||||||
int smax, tmax, size;
|
int smax, tmax, size;
|
||||||
|
@ -484,145 +454,72 @@ Vk_RenderLightmappedPoly(msurface_t *surf, const float *modelMatrix, float alpha
|
||||||
R_SetCacheState(surf, &r_newrefdef);
|
R_SetCacheState(surf, &r_newrefdef);
|
||||||
|
|
||||||
lmtex = surf->lightmaptexturenum;
|
lmtex = surf->lightmaptexturenum;
|
||||||
QVk_UpdateTextureData(&vk_state.lightmap_textures[surf->lightmaptexturenum],
|
|
||||||
(byte*)temp, surf->light_s, surf->light_t, smax, tmax);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lmtex = surf->lightmaptexturenum + DYNLIGHTMAP_OFFSET;
|
lmtex = surf->lightmaptexturenum + DYNLIGHTMAP_OFFSET;
|
||||||
QVk_UpdateTextureData(&vk_state.lightmap_textures[lmtex],
|
|
||||||
(byte*)temp, surf->light_s, surf->light_t, smax, tmax);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
c_brush_polys++;
|
QVk_UpdateTextureData(&vk_state.lightmap_textures[lmtex],
|
||||||
|
(byte*)temp, surf->light_s, surf->light_t, smax, tmax);
|
||||||
//==========
|
|
||||||
//PGM
|
|
||||||
if (surf->texinfo->flags & SURF_SCROLL)
|
|
||||||
{
|
|
||||||
float sscroll, tscroll;
|
|
||||||
|
|
||||||
R_FlowingScroll(&r_newrefdef, surf->texinfo->flags, &sscroll, &tscroll);
|
|
||||||
|
|
||||||
VkBuffer vbo;
|
|
||||||
VkDeviceSize vboOffset;
|
|
||||||
|
|
||||||
for (p = surf->polys; p; p = p->chain)
|
|
||||||
{
|
|
||||||
VkBuffer *buffer;
|
|
||||||
VkDeviceSize dstOffset;
|
|
||||||
|
|
||||||
memcpy(verts_buffer, p->verts, sizeof(mvtx_t) * nv);
|
|
||||||
|
|
||||||
for (i = 0; i < nv; i++)
|
|
||||||
{
|
|
||||||
verts_buffer[i].texCoord[0] += sscroll;
|
|
||||||
verts_buffer[i].texCoord[1] += tscroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *vertData = QVk_GetVertexBuffer(sizeof(mvtx_t) * nv, &vbo, &vboOffset);
|
|
||||||
memcpy(vertData, verts_buffer, sizeof(mvtx_t) * nv);
|
|
||||||
|
|
||||||
Mesh_VertsRealloc((nv - 2) * 3);
|
|
||||||
GenFanIndexes(vertIdxData, 0, nv - 2);
|
|
||||||
buffer = UpdateIndexBuffer(vertIdxData, (nv - 2) * 3 * sizeof(uint16_t), &dstOffset);
|
|
||||||
|
|
||||||
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
|
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
|
|
||||||
vkCmdDrawIndexed(vk_activeCmdbuffer, (nv - 2) * 3, 1, 0, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
VkDeviceSize vboOffset;
|
|
||||||
VkBuffer vbo;
|
|
||||||
|
|
||||||
for (p = surf->polys; p; p = p->chain)
|
|
||||||
{
|
|
||||||
VkDeviceSize dstOffset;
|
|
||||||
uint8_t *vertData;
|
|
||||||
VkBuffer *buffer;
|
|
||||||
|
|
||||||
vertData = QVk_GetVertexBuffer(sizeof(mvtx_t) * nv, &vbo, &vboOffset);
|
|
||||||
memcpy(vertData, p->verts, sizeof(mvtx_t) * nv);
|
|
||||||
|
|
||||||
Mesh_VertsRealloc((nv - 2) * 3);
|
|
||||||
GenFanIndexes(vertIdxData, 0, nv - 2);
|
|
||||||
buffer = UpdateIndexBuffer(vertIdxData, (nv - 2) * 3 * sizeof(uint16_t), &dstOffset);
|
|
||||||
|
|
||||||
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
|
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
|
|
||||||
vkCmdDrawIndexed(vk_activeCmdbuffer, (nv - 2) * 3, 1, 0, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//PGM
|
|
||||||
//==========
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
VkDeviceSize vboOffset, dstOffset;
|
||||||
|
VkBuffer vbo, *buffer;
|
||||||
|
uint8_t *vertData;
|
||||||
|
float sscroll = 0, tscroll = 0;
|
||||||
|
int pos_vect = 0, index_pos = 0;
|
||||||
|
|
||||||
|
c_brush_polys++;
|
||||||
|
|
||||||
|
//==========
|
||||||
|
//PGM
|
||||||
|
if (surf->texinfo->flags & SURF_SCROLL)
|
||||||
{
|
{
|
||||||
c_brush_polys++;
|
R_FlowingScroll(&r_newrefdef, surf->texinfo->flags, &sscroll, &tscroll);
|
||||||
|
|
||||||
//==========
|
|
||||||
//PGM
|
|
||||||
if (surf->texinfo->flags & SURF_SCROLL)
|
|
||||||
{
|
|
||||||
float sscroll, tscroll;
|
|
||||||
|
|
||||||
R_FlowingScroll(&r_newrefdef, surf->texinfo->flags, &sscroll, &tscroll);
|
|
||||||
|
|
||||||
for (p = surf->polys; p; p = p->chain)
|
|
||||||
{
|
|
||||||
VkDeviceSize vboOffset, dstOffset;
|
|
||||||
VkBuffer vbo, *buffer;
|
|
||||||
uint8_t *vertData;
|
|
||||||
|
|
||||||
memcpy(verts_buffer, p->verts, sizeof(mvtx_t) * nv);
|
|
||||||
|
|
||||||
for (i = 0; i < nv; i++)
|
|
||||||
{
|
|
||||||
verts_buffer[i].texCoord[0] += sscroll;
|
|
||||||
verts_buffer[i].texCoord[1] += tscroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
vertData = QVk_GetVertexBuffer(sizeof(mvtx_t) * nv, &vbo, &vboOffset);
|
|
||||||
memcpy(vertData, verts_buffer, sizeof(mvtx_t) * nv);
|
|
||||||
|
|
||||||
Mesh_VertsRealloc((nv - 2) * 3);
|
|
||||||
GenFanIndexes(vertIdxData, 0, nv - 2);
|
|
||||||
buffer = UpdateIndexBuffer(vertIdxData, (nv - 2) * 3 * sizeof(uint16_t), &dstOffset);
|
|
||||||
|
|
||||||
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
|
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
|
|
||||||
vkCmdDrawIndexed(vk_activeCmdbuffer, (nv - 2) * 3, 1, 0, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//PGM
|
|
||||||
//==========
|
|
||||||
for (p = surf->polys; p; p = p->chain)
|
|
||||||
{
|
|
||||||
VkDeviceSize vboOffset, dstOffset;
|
|
||||||
VkBuffer vbo, *buffer;
|
|
||||||
uint8_t *vertData;
|
|
||||||
|
|
||||||
vertData = QVk_GetVertexBuffer(sizeof(mvtx_t) * nv, &vbo, &vboOffset);
|
|
||||||
memcpy(vertData, p->verts, sizeof(mvtx_t) * nv);
|
|
||||||
|
|
||||||
Mesh_VertsRealloc((nv - 2) * 3);
|
|
||||||
GenFanIndexes(vertIdxData, 0, nv - 2);
|
|
||||||
buffer = UpdateIndexBuffer(vertIdxData, (nv - 2) * 3 * sizeof(uint16_t), &dstOffset);
|
|
||||||
|
|
||||||
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
|
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
|
|
||||||
vkCmdDrawIndexed(vk_activeCmdbuffer, (nv - 2) * 3, 1, 0, 0, 0);
|
|
||||||
}
|
|
||||||
//==========
|
|
||||||
//PGM
|
|
||||||
}
|
|
||||||
//PGM
|
|
||||||
//==========
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (p = surf->polys; p; p = p->chain)
|
||||||
|
{
|
||||||
|
if (Mesh_VertsRealloc(pos_vect + nv))
|
||||||
|
{
|
||||||
|
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(verts_buffer + pos_vect, p->verts, sizeof(mvtx_t) * nv);
|
||||||
|
for (i = 0; i < nv; i++)
|
||||||
|
{
|
||||||
|
verts_buffer[pos_vect + i].texCoord[0] += sscroll;
|
||||||
|
verts_buffer[pos_vect + i].texCoord[1] += tscroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenFanIndexes(vertIdxData + index_pos,
|
||||||
|
pos_vect, nv - 2 + pos_vect);
|
||||||
|
pos_vect += nv;
|
||||||
|
index_pos += (nv - 2) * 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVk_BindPipeline(&vk_drawPolyLmapPipeline);
|
||||||
|
|
||||||
|
VkDescriptorSet descriptorSets[] = {
|
||||||
|
image->vk_texture.descriptorSet,
|
||||||
|
*uboDescriptorSet,
|
||||||
|
vk_state.lightmap_textures[lmtex].descriptorSet
|
||||||
|
};
|
||||||
|
|
||||||
|
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||||
|
vk_drawPolyLmapPipeline.layout, 0, 3, descriptorSets, 1, uboOffset);
|
||||||
|
|
||||||
|
vertData = QVk_GetVertexBuffer(sizeof(mvtx_t) * pos_vect, &vbo, &vboOffset);
|
||||||
|
memcpy(vertData, verts_buffer, sizeof(mvtx_t) * pos_vect);
|
||||||
|
|
||||||
|
buffer = UpdateIndexBuffer(vertIdxData, index_pos * sizeof(uint16_t), &dstOffset);
|
||||||
|
|
||||||
|
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);
|
||||||
|
//PGM
|
||||||
|
//==========
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -646,6 +543,27 @@ R_DrawInlineBModel(entity_t *currententity, const model_t *currentmodel, float *
|
||||||
alpha = .25f;
|
alpha = .25f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct {
|
||||||
|
float model[16];
|
||||||
|
float viewLightmaps;
|
||||||
|
} lmapPolyUbo;
|
||||||
|
|
||||||
|
lmapPolyUbo.viewLightmaps = r_lightmap->value ? 1.f : 0.f;
|
||||||
|
|
||||||
|
if (modelMatrix)
|
||||||
|
{
|
||||||
|
memcpy(lmapPolyUbo.model, modelMatrix, sizeof(float) * 16);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Mat_Identity(lmapPolyUbo.model);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t uboOffset;
|
||||||
|
VkDescriptorSet uboDescriptorSet;
|
||||||
|
uint8_t *uboData = QVk_GetUniformBuffer(sizeof(lmapPolyUbo), &uboOffset, &uboDescriptorSet);
|
||||||
|
memcpy(uboData, &lmapPolyUbo, sizeof(lmapPolyUbo));
|
||||||
|
|
||||||
/* draw texture */
|
/* draw texture */
|
||||||
for (i = 0; i < currentmodel->nummodelsurfaces; i++, psurf++)
|
for (i = 0; i < currentmodel->nummodelsurfaces; i++, psurf++)
|
||||||
{
|
{
|
||||||
|
@ -669,7 +587,8 @@ R_DrawInlineBModel(entity_t *currententity, const model_t *currentmodel, float *
|
||||||
}
|
}
|
||||||
else if (!(psurf->flags & SURF_DRAWTURB) && !r_showtris->value)
|
else if (!(psurf->flags & SURF_DRAWTURB) && !r_showtris->value)
|
||||||
{
|
{
|
||||||
Vk_RenderLightmappedPoly(psurf, modelMatrix, alpha, currententity);
|
Vk_RenderLightmappedPoly(psurf, alpha, currententity,
|
||||||
|
&uboDescriptorSet, &uboOffset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -834,6 +753,19 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct {
|
||||||
|
float model[16];
|
||||||
|
float viewLightmaps;
|
||||||
|
} lmapPolyUbo;
|
||||||
|
|
||||||
|
lmapPolyUbo.viewLightmaps = r_lightmap->value ? 1.f : 0.f;
|
||||||
|
Mat_Identity(lmapPolyUbo.model);
|
||||||
|
|
||||||
|
uint32_t uboOffset;
|
||||||
|
VkDescriptorSet uboDescriptorSet;
|
||||||
|
uint8_t *uboData = QVk_GetUniformBuffer(sizeof(lmapPolyUbo), &uboOffset, &uboDescriptorSet);
|
||||||
|
memcpy(uboData, &lmapPolyUbo, sizeof(lmapPolyUbo));
|
||||||
|
|
||||||
/* draw stuff */
|
/* draw stuff */
|
||||||
for (c = node->numsurfaces,
|
for (c = node->numsurfaces,
|
||||||
surf = r_worldmodel->surfaces + node->firstsurface;
|
surf = r_worldmodel->surfaces + node->firstsurface;
|
||||||
|
@ -864,7 +796,8 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
||||||
{
|
{
|
||||||
if (!(surf->flags & SURF_DRAWTURB) && !r_showtris->value)
|
if (!(surf->flags & SURF_DRAWTURB) && !r_showtris->value)
|
||||||
{
|
{
|
||||||
Vk_RenderLightmappedPoly(surf, NULL, 1.f, currententity);
|
Vk_RenderLightmappedPoly(surf, 1.f, currententity,
|
||||||
|
&uboDescriptorSet, &uboOffset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue