diff --git a/src/game.c b/src/game.c index 7c1e7d2..31fdfd7 100644 --- a/src/game.c +++ b/src/game.c @@ -74,7 +74,7 @@ gRunCycle(gGameCtx *ctx, pGameInput *inputs, u32 i_count) u64 index = vFrameIndex(); - rDescHandle yoder = rGetAsset("models/yoda"); + //rDescHandle yoder = rGetAsset("models/yoda"); rViewportSize(&ctx->pc.res); ctx->pc.time = (f32)pCPUTimerRead(); @@ -92,9 +92,9 @@ gRunCycle(gGameCtx *ctx, pGameInput *inputs, u32 i_count) //rBufferBindGUIVertex(); //rBufferBindGUIIndex(); - rBufferBindMesh(&ctx->pc, yoder); + //rBufferBindMesh(&ctx->pc, yoder); - rDrawMesh(yoder); + //rDrawMesh(yoder); rFrameFinish(); diff --git a/src/renderer.h b/src/renderer.h index 997ca25..032148f 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -4,11 +4,6 @@ typedef struct rDescHandle rDescHandle; -// @requirement rRenderBufferType type -// @requirement u32 size -// @requirement u32 index -typedef struct rRenderBuffer rRenderBuffer; - // @requirement rTextureBufferType type // @requirement u32 width // @requirement u32 height @@ -80,20 +75,6 @@ typedef struct rPBRVertex Vec4 col; } rPBRVertex; -typedef struct rUploadQueue -{ - union - { - rRenderBuffer **queued_buffers; - rTextureBuffer **queued_textures; - rawptr *queued_ptrs; - }; - rawptr *data; - TicketMut ticket_mut; - Mut mut; - JobQueue job_queue; -} rUploadQueue; - typedef struct rMappedBuffer { rawptr ptr; @@ -110,8 +91,6 @@ void rDestroy(); // ::Renderer::Buffers::Header:: static b32 rBufferMap(); -static void rBufferBindVertex(rRenderBuffer *buffer); -static void rBufferBindIndex(rRenderBuffer *buffer); static rawptr rBufferGUIVertMapping(); static rawptr rBufferGUIIdxMapping(); static void rBufferBindGUIVertex(); diff --git a/src/renderer_vulkan.c b/src/renderer_vulkan.c index 1bdfd07..859aa57 100644 --- a/src/renderer_vulkan.c +++ b/src/renderer_vulkan.c @@ -503,11 +503,9 @@ vAssetSearch(c8 *asset_name) vAsset *asset = NULL; u64 hash = HashFromString(String8CStr(asset_name)); - Printfln("hash %llu", hash); vAssetArray assets = v_Renderer.buffers.assets; for (u64 i = 0; i < assets.length; i += 1) { - Printfln("asset_hash %llu", assets.data[i].hash); if (hash == assets.data[i].hash) { asset = assets.data + i; @@ -521,7 +519,6 @@ vAssetSearch(c8 *asset_name) static vAsset * vAssetLookupIndex(u32 asset_idx) { - Printfln("asset_idx %llu", asset_idx); Assert(asset_idx < ASSET_MAX, "asset index is out of range"); return v_Renderer.buffers.assets.data + asset_idx; } @@ -620,6 +617,71 @@ vMapBuffer(VmaAllocation alloc) +// ::Vulkan::Transfers::Start:: + +static b32 +vTransferBufferCopy(vMappedBuffer *transfer, vCopyTarget *target) +{ + u64 rem_data = target->data.len - target->offset; + u64 rem_tfer = transfer->data.len - transfer->offset; + u64 copy_len = Minu64(rem_data, rem_tfer); + + rawptr data_ptr = PtrAdd(target->data.ptr, target->offset); + rawptr tfer_ptr = PtrAdd(transfer->data.ptr, transfer->offset); + + MemCpy(tfer_ptr, data_ptr, copy_len); + + transfer->offset += copy_len; + target->offset += copy_len; + + return transfer->offset == transfer->data.len; +} + +static b32 +vBufferCopy() +{ + +} + +// ::Vulkan::Transfers::End:: + + + +// ::Vulkan::Misc::Start:: + +static void +vCopyTargetSet(vCopyTarget *target, rawptr data, u64 len) +{ + target->data.ptr = data; + target->data.len = len; + target->offset = 0; +} + +static b32 +vMappedBufferInit(vMappedBuffer *buffer, u64 len, rRenderBufferType type) +{ + b32 success = true; + + VkResult result = vBufferCreate(&buffer->alloc, type, len); + if (result != VK_SUCCESS) + { + Printfln("vMappedBufferInit failure: %s", vVkResultStr(result)); + success = false; + } + + if (success) + { + buffer->data.ptr = vMapBuffer(buffer->alloc.alloc); + buffer->data.len = len; + } + + return success; +} + +// ::Vulkan::Misc::End:: + + + // ::Vulkan::Init::Functions::Start:: static b32 @@ -1726,7 +1788,7 @@ vAssetsInit() .bufferOffset = 0, }; - MemCpy(transfer->ptr, asset.bytes, asset.len); + MemCpy(transfer->data.ptr, asset.bytes, asset.len); vImageTransitionLayout(cmd, view->image.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vkCmdCopyBufferToImage(cmd, transfer->alloc.buffer, view->image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); @@ -1767,7 +1829,7 @@ vAssetsInit() .size = sizeof(vMesh), }; - rawptr ptr = transfer->ptr; + rawptr ptr = transfer->data.ptr; MemCpy(ptr, &mesh, sizeof(vMesh)); @@ -1824,30 +1886,9 @@ vBuffersInit() b32 success = true; VkResult result; - result = vBufferCreate(&buf->gui_vert.alloc, rRBT_VERTEX | rRBT_HOST, VERTEX_BUFFER_CAP); - if (result != VK_SUCCESS) - success = false; - - if (success) - { - result = vBufferCreate(&buf->gui_idx.alloc, rRBT_INDEX | rRBT_HOST, INDEX_BUFFER_CAP); // TODO: figure out ratio of memory alloc from vertex -> index - if (result != VK_SUCCESS) - success = false; - } - - if (success) - { - result = vBufferCreate(&buf->transfer.alloc, rRBT_STAGING, TRANSFER_BUFFER_CAP); - if (result != VK_SUCCESS) - success = false; - } - - buf->gui_vert.ptr = vMapBuffer(buf->gui_vert.alloc.alloc); - buf->gui_vert.cap = MB(32); - buf->gui_idx.ptr = vMapBuffer(buf->gui_idx.alloc.alloc); - buf->gui_idx.cap = MB(8); - buf->transfer.ptr = vMapBuffer(buf->transfer.alloc.alloc); - buf->transfer.cap = MB(64); + success &= vMappedBufferInit(&buf->gui_vert, VERTEX_BUFFER_CAP, rRBT_VERTEX | rRBT_HOST); + success &= vMappedBufferInit(&buf->gui_idx, INDEX_BUFFER_CAP, rRBT_INDEX | rRBT_HOST); + success &= vMappedBufferInit(&buf->transfer, TRANSFER_BUFFER_CAP, rRBT_STAGING); return success; } @@ -1877,7 +1918,7 @@ vTransferUpload(vTransfer **transfers, u32 count) rawptr data_ptr = NULL; u64 data_len = 0; - rawptr ptr = transfer->ptr; + rawptr ptr = transfer->data.ptr; u64 ptr_pos = 0; u64 transfer_size = 0; VkDeviceSize offset = 0; @@ -1903,12 +1944,12 @@ vTransferUpload(vTransfer **transfers, u32 count) data_ptr = transfers[i]->data; } - if (ptr_pos == transfer->cap) + if (ptr_pos == transfer->data.len) { vImmSubmitFinish(device, fence, buffer, queue); vkWaitForFences(device, 1, &fence, VK_TRUE, 999999999); - ptr = transfer->ptr; + ptr = transfer->data.ptr; offset = 0; imm_started = false; } diff --git a/src/renderer_vulkan.h b/src/renderer_vulkan.h index 7c69cd8..9e5cf39 100644 --- a/src/renderer_vulkan.h +++ b/src/renderer_vulkan.h @@ -196,6 +196,12 @@ typedef struct vAssetInfo u64 asset_id; } vAssetInfo; +typedef struct vCopyTarget +{ + DataPtr data; + u64 offset; +} vCopyTarget; + typedef struct vDeviceQueues { i32 graphics, transfer; @@ -383,9 +389,9 @@ typedef struct vRImages typedef struct vMappedBuffer { - vBuffer alloc; - rawptr ptr; - u64 cap; + vBuffer alloc; + DataPtr data; + u64 offset; } vMappedBuffer; typedef struct vRBuffers @@ -471,16 +477,6 @@ typedef struct rTextureBuffer u32 index; } rTextureBuffer; -typedef struct rRenderBuffer -{ - rRenderBufferType type; - VkBuffer buffer; - VmaAllocation alloc; - VmaAllocationInfo info; - u32 size; - u32 index; // TODO(MA): use this -} rRenderBuffer; - typedef struct rPushConst { Vec2 res; @@ -601,6 +597,16 @@ static vAsset *vAssetLookupIndex(u32 asset_idx); static VkResult vBufferCreate(vBuffer* buf, rRenderBufferType type, u64 size); static rawptr vMapBuffer(VmaAllocation alloc); +// ::Vulkan::Transfers::Header:: + +static b32 vTransferBufferCopy(vMappedBuffer *transfer, vCopyTarget *target); +static b32 vBufferCopy(); + +// ::Vulkan::Misc::Header:: + +static b32 vMappedBufferInit(vMappedBuffer *buffer, u64 len, rRenderBufferType type); +static void vCopyTargetSet(vCopyTarget *target, rawptr data, u64 len); + // ::Vulkan::CleanUp::Functions::Header:: static void vSwapchainDestroy(); diff --git a/src/renderer_vulkan_public.c b/src/renderer_vulkan_public.c index 98a0fb3..cfe4a61 100644 --- a/src/renderer_vulkan_public.c +++ b/src/renderer_vulkan_public.c @@ -117,27 +117,6 @@ rDestroy() // ::Vulkan::Renderer::Buffers::Functions::Start:: -static void -rBufferBindVertex(rRenderBuffer *buffer) -{ - Assert(buffer && buffer->type == rRBT_VERTEX, "rBufferBindVertex: invalid buffer provided"); - - VkCommandBuffer cmd = vFrameCmdBuf(); - VkDeviceSize offsets = 0; - - vkCmdBindVertexBuffers(cmd, 0, 1, &buffer->buffer, &offsets); -} - -static void -rBufferBindIndex(rRenderBuffer *buffer) -{ - Assert(buffer && buffer->type == rRBT_INDEX, "rBufferBindIndex: invalid buffer provided"); - - VkCommandBuffer cmd = vFrameCmdBuf(); - - vkCmdBindIndexBuffer(cmd, buffer->buffer, 0, VK_INDEX_TYPE_UINT32); -} - static void vBufferQueueWait() { @@ -151,13 +130,13 @@ vBufferQueueWait() static rawptr rBufferGUIVertMapping() { - return v_Renderer.buffers.gui_vert.ptr; + return v_Renderer.buffers.gui_vert.data.ptr; } static rawptr rBufferGUIIdxMapping() { - return v_Renderer.buffers.gui_idx.ptr; + return v_Renderer.buffers.gui_idx.data.ptr; } static void @@ -267,7 +246,7 @@ rFrameBegin() #endif // TODO(MA): make this work with VK_PRESENT_MODE_MAILBOX_KHR and remove assignment of present mode to FIFO - result = vkWaitForFences(device, 1, &fence, VK_TRUE, 1000000000); + result = vkWaitForFences(device, 1, &fence, VK_TRUE, 10000000000); if (result != VK_SUCCESS) { Printfln("vkWaitForFences failure: %s", vVkResultStr(result)); diff --git a/src/stglib.h b/src/stglib.h index d71a4b5..0a28323 100644 --- a/src/stglib.h +++ b/src/stglib.h @@ -51,6 +51,12 @@ typedef uint32_t b32; typedef void * rawptr; +typedef struct DataPtr +{ + rawptr ptr; + u64 len; +} DataPtr; + typedef struct String8 { c8 *value; @@ -677,7 +683,7 @@ i32 _EPrintf(char *fmt, va_list arg); #define BitEq(var, bits) (((var) & (bits)) == (bits)) #define AlignPow2(x, b) (((x) + (b) - 1) & (~((b) - 1))) #define IsPow2(x) ((x) != 0 && ((x) &((x) - 1)) == 0) -#define PtrAdd(ptr, add) (((u8 *)ptr) + add) +#define PtrAdd(ptr, add) ((rawptr)(((uintptr)ptr) + ((uintptr)add))) #define PtrAddAdjustLen(ptr, len, add) \ ptr = PtrAdd(ptr, add); \ len -= add