[vulkan] Create the lights buffer

It's a tad bogus as it's the lights close to the camera, but it should
at least be a good start once things are working. There's currently
something very wrong with the state of things.
This commit is contained in:
Bill Currie 2021-01-27 16:16:28 +09:00
parent 4da8feca36
commit 9f64416846
4 changed files with 59 additions and 7 deletions

View file

@ -18,6 +18,11 @@ typedef struct qfv_buffertransitionset_s
typedef struct qfv_bufferbarrierset_s
DARRAY_TYPE (VkBufferMemoryBarrier) qfv_bufferbarrierset_t;
typedef struct qfv_bufferset_s
DARRAY_TYPE (VkBuffer) qfv_bufferset_t;
#define QFV_AllocBufferSet(num, allocator) \
DARRAY_ALLOCFIXED (qfv_bufferset_t, num, allocator)
struct qfv_device_s;
VkBuffer QFV_CreateBuffer (struct qfv_device_s *device,
VkDeviceSize size,

View file

@ -125,6 +125,11 @@ static int message_types =
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
static void
debug_breakpoint (VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity)
{
}
static VKAPI_ATTR VkBool32 VKAPI_CALL
debug_callback (VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageType,
@ -144,7 +149,9 @@ debug_callback (VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
msgSev = "error: ";
}
fprintf (stderr, "validation layer: %s%s\n", msgSev, callbackData->pMessage);
fprintf (stderr, "validation layer: %s%s\n", msgSev,
callbackData->pMessage);
debug_breakpoint (messageSeverity);
return VK_FALSE;
}

View file

@ -55,6 +55,7 @@
#include "QF/Vulkan/qf_alias.h"
#include "QF/Vulkan/qf_texture.h"
#include "QF/Vulkan/buffer.h"
#include "QF/Vulkan/command.h"
#include "QF/Vulkan/descriptor.h"
#include "QF/Vulkan/device.h"
@ -131,8 +132,9 @@ Vulkan_DrawAlias (struct entity_s *ent, struct vulkan_ctx_s *ctx)
dfunc->vkCmdPushDescriptorSetKHR (aframe->cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS,
actx->layout,
0, 2, aframe->descriptors
+ ALIAS_BUFFER_INFOS);
ALIAS_BUFFER_INFOS, ALIAS_IMAGE_INFOS,
aframe->descriptors
+ ALIAS_BUFFER_INFOS);
dfunc->vkCmdDrawIndexed (aframe->cmd, 3 * hdr->mdl.numtris, 1, 0, 0, 0);
}
@ -142,6 +144,8 @@ Vulkan_AliasBegin (vulkan_ctx_t *ctx)
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
aliasctx_t *actx = ctx->alias_context;
dlight_t *lights[ALIAS_LIGHTS];
//XXX quat_t fog;
__auto_type cframe = &ctx->framebuffers.a[ctx->curFrame];
@ -149,6 +153,18 @@ Vulkan_AliasBegin (vulkan_ctx_t *ctx)
VkCommandBuffer cmd = aframe->cmd;
DARRAY_APPEND (cframe->subCommand, cmd);
R_FindNearLights (r_origin, ALIAS_LIGHTS, lights);
aframe->lights->light_count = 0;
for (int i = 0; i < ALIAS_LIGHTS; i++) {
if (!lights[i]) {
break;
}
aframe->lights->light_count++;
VectorCopy (lights[i]->color, aframe->lights->lights[i].color);
VectorCopy (lights[i]->origin, aframe->lights->lights[i].position);
aframe->lights->lights[i].dist = lights[i]->radius;
}
//FIXME need per frame matrices
aframe->bufferInfo[0].buffer = ctx->matrices.buffer_3d;
aframe->bufferInfo[1].buffer = aframe->light_buffer;
@ -169,6 +185,12 @@ Vulkan_AliasBegin (vulkan_ctx_t *ctx)
dfunc->vkCmdBindPipeline (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
actx->pipeline);
VkDescriptorSet sets[] = {
aframe->descriptors[0].dstSet,
aframe->descriptors[1].dstSet,
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
actx->layout, 0, 2, sets, 0, 0);
VkViewport viewport = {0, 0, vid.width, vid.height, 0, 1};
VkRect2D scissor = { {0, 0}, {vid.width, vid.height} };
dfunc->vkCmdSetViewport (cmd, 0, 1, &viewport);
@ -214,6 +236,7 @@ void
Vulkan_Alias_Init (vulkan_ctx_t *ctx)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
aliasctx_t *actx = calloc (1, sizeof (aliasctx_t));
ctx->alias_context = actx;
@ -239,10 +262,29 @@ Vulkan_Alias_Init (vulkan_ctx_t *ctx)
__auto_type cmdBuffers = QFV_AllocCommandBufferSet (frames, alloca);
QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdBuffers);
__auto_type lbuffers = QFV_AllocBufferSet (frames, alloca);
for (size_t i = 0; i < frames; i++) {
lbuffers->a[i] = QFV_CreateBuffer (device, sizeof (qfv_light_buffer_t),
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
}
VkMemoryRequirements requirements;
dfunc->vkGetBufferMemoryRequirements (device->dev, lbuffers->a[0],
&requirements);
actx->light_memory = QFV_AllocBufferMemory (device, lbuffers->a[0],
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
frames * requirements.size, 0);
byte *light_data;
dfunc->vkMapMemory (device->dev, actx->light_memory, 0,
frames * requirements.size, 0, (void **) &light_data);
__auto_type sets = QFV_AllocateDescriptorSet (device, pool, layouts);
for (size_t i = 0; i < frames; i++) {
__auto_type aframe = &actx->frames.a[i];
aframe->cmd = cmdBuffers->a[i];
aframe->light_buffer = lbuffers->a[i];
aframe->lights = (qfv_light_buffer_t *) (light_data + i * requirements.size);
QFV_BindBufferMemory (device, lbuffers->a[i], actx->light_memory,
i * requirements.size);
for (int j = 0; j < ALIAS_BUFFER_INFOS; j++) {
aframe->bufferInfo[j] = base_buffer_info;

View file

@ -109,14 +109,12 @@ setup_view (vulkan_ctx_t *ctx)
static void
R_RenderEntities (vulkan_ctx_t *ctx)
{
entity_t *ent;
int begun;
if (!r_drawentities->int_val)
return;
#define RE_LOOP(type_name, Type) \
do { \
begun = 0; \
entity_t *ent; \
int begun = 0; \
for (ent = r_ent_queue; ent; ent = ent->next) { \
if (ent->model->type != mod_##type_name) \
continue; \