diff --git a/include/QF/Vulkan/qf_bsp.h b/include/QF/Vulkan/qf_bsp.h index 969fdd92c..151e6e7be 100644 --- a/include/QF/Vulkan/qf_bsp.h +++ b/include/QF/Vulkan/qf_bsp.h @@ -81,6 +81,11 @@ typedef struct bspframe_s { VkWriteDescriptorSet descriptors[BSP_BUFFER_INFOS + BSP_IMAGE_INFOS]; } bspframe_t; +typedef struct fragconst_s { + quat_t fog; + float time; +} fragconst_t; + typedef struct bspframeset_s DARRAY_TYPE (bspframe_t) bspframeset_t; diff --git a/libs/models/brush/vulkan_model_brush.c b/libs/models/brush/vulkan_model_brush.c index b64e8c11f..c9b336f0f 100644 --- a/libs/models/brush/vulkan_model_brush.c +++ b/libs/models/brush/vulkan_model_brush.c @@ -101,7 +101,7 @@ get_image_size (VkImage image, qfv_device_t *device) } static void -transfer_mips (byte *dst, const void *_src, const texture_t *tx) +transfer_mips (byte *dst, const void *_src, const texture_t *tx, byte *palette) { const byte *src = _src; unsigned width = tx->width; @@ -113,7 +113,7 @@ transfer_mips (byte *dst, const void *_src, const texture_t *tx) // end of the texture struct offset = tx->offsets[i] - sizeof (texture_t); count = width * height; - Vulkan_ExpandPalette (dst, src + offset, vid.palette, 1, count); + Vulkan_ExpandPalette (dst, src + offset, palette, 2, count); dst += count * 4; width >>= 1; height >>= 1; @@ -218,6 +218,7 @@ load_textures (model_t *model, vulkan_ctx_t *ctx) for (int i = 0; i < model->numtextures; i++) { texture_t *tx = model->textures[i]; + byte *palette = vid.palette32; if (!tx) { continue; } @@ -227,12 +228,18 @@ load_textures (model_t *model, vulkan_ctx_t *ctx) tex->tex->offset); VkImageViewType type = VK_IMAGE_VIEW_TYPE_2D; if (strncmp (tx->name, "sky", 3) == 0) { + palette = alloca (256 * 4); + memcpy (palette, vid.palette32, 256 * 4); + // sky's black is transparent + // this hits both layers, but so long as the screen is cleared + // to black, no one should notice :) + palette[3] = 0; type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; } tex->tex->view = QFV_CreateImageView (device, tex->tex->image, type, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT); - transfer_mips (buffer + tex->tex->offset, tx + 1, tx); + transfer_mips (buffer + tex->tex->offset, tx + 1, tx, palette); if (tex->glow) { dfunc->vkBindImageMemory (device->dev, tex->glow->image, mem, tex->glow->offset); @@ -242,7 +249,8 @@ load_textures (model_t *model, vulkan_ctx_t *ctx) VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT); - transfer_mips (buffer + tex->glow->offset, tex->glow->memory, tx); + transfer_mips (buffer + tex->glow->offset, tex->glow->memory, tx, + palette); } } diff --git a/libs/video/renderer/vulkan/quakebsp.frag b/libs/video/renderer/vulkan/quakebsp.frag index 483a3887e..fe596246e 100644 --- a/libs/video/renderer/vulkan/quakebsp.frag +++ b/libs/video/renderer/vulkan/quakebsp.frag @@ -8,8 +8,8 @@ layout (set = 0, binding = 5) uniform samplerCube SkyCube; layout (push_constant) uniform PushConstants { layout (offset = 64) - float time; vec4 fog; + float time; }; layout (location = 0) in vec4 tl_st; diff --git a/libs/video/renderer/vulkan/vulkan_bsp.c b/libs/video/renderer/vulkan/vulkan_bsp.c index bfd54f9e8..6da253bea 100644 --- a/libs/video/renderer/vulkan/vulkan_bsp.c +++ b/libs/video/renderer/vulkan/vulkan_bsp.c @@ -908,6 +908,9 @@ turb_begin (bspctx_t *bctx) glsl_Fog_GetColor (fog); fog[3] = glsl_Fog_GetDensity () / 64.0; + fragconst_t frag_constants = { time: vr_data.realtime }; + dfunc->vkCmdPushConstants (cmd, bctx->layout, VK_SHADER_STAGE_FRAGMENT_BIT, + 64, sizeof (fragconst_t), &frag_constants); qfeglUniform4fv (quake_turb.fog.location, 1, fog); qfeglUniform1i (quake_turb.palette.location, 1); @@ -967,15 +970,10 @@ sky_begin (vulkan_ctx_t *ctx) qfv_device_t *device = ctx->device; qfv_devfuncs_t *dfunc = device->funcs; bspctx_t *bctx = ctx->bsp_context; - //XXX quat_t fog; bctx->default_color[3] = 1; QuatCopy (bctx->default_color, bctx->last_color); - //XXX glsl_Fog_GetColor (fog); - //fog[3] = glsl_Fog_GetDensity () / 64.0; - //qfeglUniform4fv (sky_params.fog->location, 1, fog); - spin (ctx->matrices.sky_3d, bctx); __auto_type cframe = &ctx->framebuffers.a[ctx->curFrame]; @@ -1121,10 +1119,10 @@ Vulkan_DrawWorld (vulkan_ctx_t *ctx) dfunc->vkCmdPushConstants (bframe->bsp_cmd, bctx->layout, VK_SHADER_STAGE_VERTEX_BIT, 0, 16 * sizeof (float), identity); - float frag_pc[8] = { }; + fragconst_t frag_constants = { time: vr_data.realtime }; dfunc->vkCmdPushConstants (bframe->bsp_cmd, bctx->layout, VK_SHADER_STAGE_FRAGMENT_BIT, - 64, 8 * sizeof (float), &frag_pc); + 64, sizeof (fragconst_t), &frag_constants); //XXX qfeglActiveTexture (GL_TEXTURE0 + 0); for (size_t i = 0; i < bctx->texture_chains.size; i++) { vulktex_t *tex; @@ -1234,10 +1232,10 @@ Vulkan_DrawSky (vulkan_ctx_t *ctx) dfunc->vkCmdPushConstants (bframe->sky_cmd, bctx->layout, VK_SHADER_STAGE_VERTEX_BIT, 0, 16 * sizeof (float), identity); - float frag_pc[8] = { }; + fragconst_t frag_constants = { time: vr_data.realtime }; dfunc->vkCmdPushConstants (bframe->sky_cmd, bctx->layout, VK_SHADER_STAGE_FRAGMENT_BIT, - 64, 8 * sizeof (float), &frag_pc); + 64, sizeof (fragconst_t), &frag_constants); for (is = bctx->sky_chain; is; is = is->tex_chain) { surf = is->surface; if (tex != surf->texinfo->texture->render) { diff --git a/libs/video/renderer/vulkan/vulkan_texture.c b/libs/video/renderer/vulkan/vulkan_texture.c index 86bd890ab..c1a4e28f0 100644 --- a/libs/video/renderer/vulkan/vulkan_texture.c +++ b/libs/video/renderer/vulkan/vulkan_texture.c @@ -89,7 +89,16 @@ void Vulkan_ExpandPalette (byte *dst, const byte *src, const byte *palette, int alpha, int count) { - if (alpha) { + if (alpha > 1) { + while (count-- > 0) { + int pix = *src++; + const byte *col = palette + pix * 4; + *dst++ = *col++; + *dst++ = *col++; + *dst++ = *col++; + *dst++ = *col++; + } + } else if (alpha) { while (count-- > 0) { byte pix = *src++; const byte *col = palette + pix * 3;