mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-22 02:11:19 +00:00
[vulkan] Clean up image barriers a bit
Mostly, this gets the stage flags in with the barrier, but also adds a couple more barrier templates. It should make for slightly less verbose code, and one less opportunity for error (mismatched barrier/stages).
This commit is contained in:
parent
8c03ed8be5
commit
dc9b64fadd
8 changed files with 198 additions and 232 deletions
|
@ -2,21 +2,22 @@
|
|||
#define __QF_Vulkan_barrier_h
|
||||
|
||||
typedef struct {
|
||||
VkPipelineStageFlags src;
|
||||
VkPipelineStageFlags dst;
|
||||
} qfv_pipelinestagepair_t;
|
||||
VkPipelineStageFlags srcStages;
|
||||
VkPipelineStageFlags dstStages;
|
||||
VkImageMemoryBarrier barrier;
|
||||
} qfv_imagebarrier_t;
|
||||
|
||||
//XXX Note: imageLayoutTransitionBarriers, imageLayoutTransitionStages and
|
||||
// the enum must be kept in sync
|
||||
//XXX Note: imageBarriers and the enum must be kept in sync
|
||||
enum {
|
||||
qfv_LT_Undefined_to_TransferDst,
|
||||
qfv_LT_TransferDst_to_TransferSrc,
|
||||
qfv_LT_TransferDst_to_ShaderReadOnly,
|
||||
qfv_LT_TransferSrc_to_ShaderReadOnly,
|
||||
qfv_LT_ShaderReadOnly_to_TransferDst,
|
||||
qfv_LT_Undefined_to_DepthStencil,
|
||||
qfv_LT_Undefined_to_Color,
|
||||
};
|
||||
|
||||
extern const VkImageMemoryBarrier imageLayoutTransitionBarriers[];
|
||||
extern const qfv_pipelinestagepair_t imageLayoutTransitionStages[];
|
||||
extern const qfv_imagebarrier_t imageBarriers[];
|
||||
|
||||
#endif//__QF_Vulkan_barrier_h
|
||||
|
|
|
@ -184,17 +184,13 @@ Vulkan_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skinpix, int skinsize,
|
|||
|
||||
Vulkan_ExpandPalette (base_data, tskin, vid.palette, 1, skinsize);
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.image = skin->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.image = skin->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
|
||||
VkBufferImageCopy copy = {
|
||||
packet->offset, 0, 0,
|
||||
|
@ -207,14 +203,13 @@ Vulkan_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skinpix, int skinsize,
|
|||
1, ©);
|
||||
|
||||
if (mipLevels == 1) {
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.image = skin->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.image = skin->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
} else {
|
||||
QFV_GenerateMipMaps (device, packet->cmd, skin->image,
|
||||
mipLevels, w, h, 4);
|
||||
|
|
|
@ -257,10 +257,9 @@ load_textures (model_t *mod, vulkan_ctx_t *ctx)
|
|||
}
|
||||
|
||||
// base barrier
|
||||
VkImageMemoryBarrier barrier;
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
|
||||
__auto_type barriers = QFV_AllocImageBarrierSet (image_count, malloc);
|
||||
barriers->size = 0;
|
||||
|
@ -271,18 +270,15 @@ load_textures (model_t *mod, vulkan_ctx_t *ctx)
|
|||
}
|
||||
vulktex_t *tex = tx->render;
|
||||
__auto_type b = &barriers->a[barriers->size++];
|
||||
*b = barrier;
|
||||
*b = ib.barrier;
|
||||
b->image = tex->tex->image;
|
||||
if (tex->glow) {
|
||||
b = &barriers->a[barriers->size++];
|
||||
*b = barrier;
|
||||
*b = ib.barrier;
|
||||
b->image = tex->glow->image;
|
||||
}
|
||||
}
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
barriers->size, barriers->a);
|
||||
for (int i = 0, j = 0; i < brush->numtextures; i++) {
|
||||
|
@ -307,8 +303,8 @@ load_textures (model_t *mod, vulkan_ctx_t *ctx)
|
|||
}
|
||||
}
|
||||
|
||||
stages=imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
barriers->size, barriers->a);
|
||||
QFV_PacketSubmit (packet);
|
||||
|
|
|
@ -31,71 +31,105 @@
|
|||
#include "QF/Vulkan/qf_vid.h"
|
||||
#include "QF/Vulkan/barrier.h"
|
||||
|
||||
const VkImageMemoryBarrier imageLayoutTransitionBarriers[] = {
|
||||
const qfv_imagebarrier_t imageBarriers[] = {
|
||||
// undefined -> transfer dst optimal
|
||||
{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
0,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
0,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
// transfer dst optimal -> transfer src optimal
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
// transfer dst optimal -> shader read only optimal
|
||||
{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
// transfer src optimal -> shader read only optimal
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
// shader read only optimal -> transfer dst optimal
|
||||
{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
// undefined -> depth stencil attachment optimal
|
||||
{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
0,
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
|
||||
| VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1 }
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
0,
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
|
||||
| VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
// undefined -> color attachment optimal
|
||||
{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
0,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
|
||||
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
{
|
||||
.srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||
.dstStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
.barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
0,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
|
||||
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
|
||||
},
|
||||
},
|
||||
{ /* end of transition barriers */ }
|
||||
};
|
||||
|
||||
const qfv_pipelinestagepair_t imageLayoutTransitionStages[] = {
|
||||
// undefined -> transfer dst optimal
|
||||
{ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT },
|
||||
// transfer dst optimal -> shader read only optimal
|
||||
{ VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT },
|
||||
// shader read only optimal -> transfer dst optimal
|
||||
{ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT },
|
||||
// undefined -> depth stencil attachment optimal
|
||||
{ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT },
|
||||
// undefined -> color attachment optimal
|
||||
{ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT },
|
||||
};
|
||||
|
|
|
@ -216,45 +216,16 @@ QFV_GenerateMipMaps (qfv_device_t *device, VkCommandBuffer cmd,
|
|||
{
|
||||
qfv_devfuncs_t *dfunc = device->funcs;
|
||||
|
||||
qfv_pipelinestagepair_t pre_stages = {
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
};
|
||||
qfv_pipelinestagepair_t post_stages = {
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
};
|
||||
qfv_pipelinestagepair_t final_stages = {
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
};
|
||||
VkImageMemoryBarrier pre_barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
image,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, layers }
|
||||
};
|
||||
VkImageMemoryBarrier post_barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
image,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, layers }
|
||||
};
|
||||
VkImageMemoryBarrier final_barrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0,
|
||||
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
image,
|
||||
{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, layers }
|
||||
};
|
||||
qfv_imagebarrier_t pre=imageBarriers[qfv_LT_TransferDst_to_TransferSrc];
|
||||
qfv_imagebarrier_t pst=imageBarriers[qfv_LT_TransferSrc_to_ShaderReadOnly];
|
||||
qfv_imagebarrier_t fnl=imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
|
||||
pre.barrier.image = image;
|
||||
pre.barrier.subresourceRange.layerCount = layers;
|
||||
pst.barrier.image = image;
|
||||
pst.barrier.subresourceRange.layerCount = layers;
|
||||
fnl.barrier.image = image;
|
||||
fnl.barrier.subresourceRange.layerCount = layers;
|
||||
|
||||
VkImageBlit blit = {
|
||||
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, layers},
|
||||
|
@ -264,17 +235,17 @@ QFV_GenerateMipMaps (qfv_device_t *device, VkCommandBuffer cmd,
|
|||
};
|
||||
|
||||
while (--mips > 0) {
|
||||
dfunc->vkCmdPipelineBarrier (cmd, pre_stages.src, pre_stages.dst, 0,
|
||||
dfunc->vkCmdPipelineBarrier (cmd, pre.srcStages, pre.dstStages, 0,
|
||||
0, 0, 0, 0,
|
||||
1, &pre_barrier);
|
||||
1, &pre.barrier);
|
||||
dfunc->vkCmdBlitImage (cmd,
|
||||
image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
1, &blit, VK_FILTER_LINEAR);
|
||||
|
||||
dfunc->vkCmdPipelineBarrier (cmd, post_stages.src, post_stages.dst, 0,
|
||||
dfunc->vkCmdPipelineBarrier (cmd, pst.srcStages, pst.dstStages, 0,
|
||||
0, 0, 0, 0,
|
||||
1, &post_barrier);
|
||||
1, &pst.barrier);
|
||||
|
||||
blit.srcSubresource.mipLevel++;
|
||||
blit.srcOffsets[1].x = blit.dstOffsets[1].x;
|
||||
|
@ -282,13 +253,13 @@ QFV_GenerateMipMaps (qfv_device_t *device, VkCommandBuffer cmd,
|
|||
blit.dstSubresource.mipLevel++;
|
||||
blit.dstOffsets[1].x = max (blit.dstOffsets[1].x >> 1, 1);
|
||||
blit.dstOffsets[1].y = max (blit.dstOffsets[1].y >> 1, 1);
|
||||
pre_barrier.subresourceRange.baseMipLevel++;
|
||||
post_barrier.subresourceRange.baseMipLevel++;
|
||||
final_barrier.subresourceRange.baseMipLevel++;
|
||||
pre.barrier.subresourceRange.baseMipLevel++;
|
||||
pst.barrier.subresourceRange.baseMipLevel++;
|
||||
fnl.barrier.subresourceRange.baseMipLevel++;
|
||||
}
|
||||
dfunc->vkCmdPipelineBarrier (cmd, final_stages.src, final_stages.dst, 0,
|
||||
dfunc->vkCmdPipelineBarrier (cmd, fnl.srcStages, fnl.dstStages, 0,
|
||||
0, 0, 0, 0,
|
||||
1, &final_barrier);
|
||||
1, &fnl.barrier);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -143,17 +143,13 @@ QFV_CreateScrap (qfv_device_t *device, const char *name, int size,
|
|||
scrap->batch_free = 0;
|
||||
scrap->batch_count = 0;
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
qfv_packet_t *packet = QFV_PacketAcquire (stage);
|
||||
// no data for the packet
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
VkClearColorValue color = {
|
||||
float32:{0xde/255.0, 0xad/255.0, 0xbe/255.0, 0xef/255.0},
|
||||
};
|
||||
|
@ -161,12 +157,11 @@ QFV_CreateScrap (qfv_device_t *device, const char *name, int size,
|
|||
dfunc->vkCmdClearColorImage (packet->cmd, scrap->image,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
&color, 1, &range);
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
QFV_PacketSubmit (packet);
|
||||
return scrap;
|
||||
}
|
||||
|
@ -322,15 +317,11 @@ QFV_ScrapFlush (scrap_t *scrap)
|
|||
copy->a[i].imageExtent.depth = 1;
|
||||
}
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_ShaderReadOnly_to_TransferDst];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_ShaderReadOnly_to_TransferDst];
|
||||
barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_ShaderReadOnly_to_TransferDst];
|
||||
ib.barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
|
||||
size_t offset = packet->offset, size;
|
||||
vrect_t *batch = scrap->batch;
|
||||
|
@ -353,12 +344,11 @@ QFV_ScrapFlush (scrap_t *scrap)
|
|||
scrap->batch_count -= i;
|
||||
}
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.image = scrap->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
|
||||
*scrap->batch_tail = scrap->batch_free;
|
||||
scrap->batch_free = scrap->batch;
|
||||
|
|
|
@ -1390,19 +1390,14 @@ create_default_skys (vulkan_ctx_t *ctx)
|
|||
|
||||
// temporarily commandeer the light map's staging buffer
|
||||
qfv_packet_t *packet = QFV_PacketAcquire (bctx->light_stage);
|
||||
VkImageMemoryBarrier barrier;
|
||||
VkImageMemoryBarrier barriers[2];
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
barriers[0] = barrier;
|
||||
barriers[1] = barrier;
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
VkImageMemoryBarrier barriers[2] = { ib.barrier, ib.barrier };
|
||||
barriers[0].image = skybox;
|
||||
barriers[1].image = skysheet;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
2, barriers);
|
||||
|
||||
|
@ -1419,15 +1414,14 @@ create_default_skys (vulkan_ctx_t *ctx)
|
|||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
&color, 1, &range);
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
barriers[0] = barrier;
|
||||
barriers[1] = barrier;
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
barriers[0] = ib.barrier;
|
||||
barriers[1] = ib.barrier;
|
||||
barriers[0].image = skybox;
|
||||
barriers[1].image = skysheet;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
2, barriers);
|
||||
QFV_PacketSubmit (packet);
|
||||
|
|
|
@ -203,16 +203,12 @@ Vulkan_LoadTex (vulkan_ctx_t *ctx, tex_t *tex, int mip, const char *name)
|
|||
qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging);
|
||||
stage_tex_data (packet, tex, bpp);
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.image = qtex->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.image = qtex->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
VkBufferImageCopy copy = {
|
||||
packet->offset, 0, 0,
|
||||
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},
|
||||
|
@ -223,12 +219,11 @@ Vulkan_LoadTex (vulkan_ctx_t *ctx, tex_t *tex, int mip, const char *name)
|
|||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
1, ©);
|
||||
if (mip == 1) {
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.image = qtex->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.image = qtex->image;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
} else {
|
||||
QFV_GenerateMipMaps (device, packet->cmd, qtex->image,
|
||||
mip, tex->width, tex->height, 1);
|
||||
|
@ -297,17 +292,13 @@ Vulkan_LoadEnvMap (vulkan_ctx_t *ctx, tex_t *tex, const char *name)
|
|||
qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging);
|
||||
stage_tex_data (packet, tex, bpp);
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.image = qtex->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.image = qtex->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
|
||||
VkBufferImageCopy copy[6] = {
|
||||
{
|
||||
|
@ -328,14 +319,13 @@ Vulkan_LoadEnvMap (vulkan_ctx_t *ctx, tex_t *tex, const char *name)
|
|||
qtex->image,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
6, copy);
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.image = qtex->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.image = qtex->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
QFV_PacketSubmit (packet);
|
||||
return qtex;
|
||||
}
|
||||
|
@ -367,17 +357,13 @@ Vulkan_LoadEnvSides (vulkan_ctx_t *ctx, tex_t **tex, const char *name)
|
|||
|
||||
qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging);
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
qfv_pipelinestagepair_t stages;
|
||||
|
||||
stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
barrier.image = qtex->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst];
|
||||
ib.barrier.image = qtex->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
|
||||
VkBufferImageCopy copy[6] = {
|
||||
{
|
||||
|
@ -395,14 +381,13 @@ Vulkan_LoadEnvSides (vulkan_ctx_t *ctx, tex_t **tex, const char *name)
|
|||
qtex->image,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
6, copy);
|
||||
stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
barrier.image = qtex->image;
|
||||
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst,
|
||||
ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
|
||||
ib.barrier.image = qtex->image;
|
||||
ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
|
||||
ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||
dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages,
|
||||
0, 0, 0, 0, 0,
|
||||
1, &barrier);
|
||||
1, &ib.barrier);
|
||||
QFV_PacketSubmit (packet);
|
||||
return qtex;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue