From 607ee777036bff11d1b318f8cfa6fbc4d4d2298a Mon Sep 17 00:00:00 2001 From: nefrace Date: Fri, 9 May 2025 22:12:20 +0300 Subject: [PATCH] Indexed rendering --- src/main.odin | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main.odin b/src/main.odin index 0868982..0e4b845 100644 --- a/src/main.odin +++ b/src/main.odin @@ -33,11 +33,14 @@ main :: proc() { {{-0.5, 0, 0}, {1, 0, 0}}, {{0, 1.0, 0}, {0, 1, 0}}, {{0.5, 0, 0}, {0, 0, 1}}, - {{0.5, 0, 0}, {1, 1, 0}}, {{0, -0.5, 0}, {0, 1, 1}}, - {{-0.5, -0, 0}, {1, 0, 1}}, } vertices_byte_size := len(vertices) * size_of(vertices[0]) + + indices := []u16{0, 1, 2, 0, 2, 3} + indices_byte_size := len(indices) * size_of(indices[0]) + + vertex_attrs := []sdl.GPUVertexAttribute { {location = 0, format = .FLOAT3, offset = 0}, // Position {location = 1, format = .FLOAT3, offset = size_of(Vec3)}, // Color @@ -46,14 +49,21 @@ main :: proc() { gpu, sdl.GPUBufferCreateInfo{usage = {.VERTEX}, size = u32(vertices_byte_size)}, ) + index_buf := sdl.CreateGPUBuffer( + gpu, + sdl.GPUBufferCreateInfo{usage = {.INDEX}, size = u32(indices_byte_size)}, + ) transfer_buf := sdl.CreateGPUTransferBuffer( gpu, - sdl.GPUTransferBufferCreateInfo{usage = .UPLOAD, size = u32(vertices_byte_size)}, + sdl.GPUTransferBufferCreateInfo { + usage = .UPLOAD, + size = u32(vertices_byte_size + indices_byte_size), + }, ) { // Copy verticies to the transfer buffer - transfer_mem := sdl.MapGPUTransferBuffer( + transfer_mem := transmute([^]byte)sdl.MapGPUTransferBuffer( gpu, transfer_buf, false, @@ -61,6 +71,7 @@ main :: proc() { defer sdl.UnmapGPUTransferBuffer(gpu, transfer_buf) mem.copy(transfer_mem, raw_data(vertices), vertices_byte_size) + mem.copy(transfer_mem[vertices_byte_size:], raw_data(indices), indices_byte_size) } { // Upload buffer to gpu @@ -75,6 +86,12 @@ main :: proc() { {buffer = vertex_buf, size = u32(vertices_byte_size)}, false, ) + sdl.UploadToGPUBuffer( + copy_pass, + {transfer_buffer = transfer_buf, offset = u32(vertices_byte_size)}, + {buffer = index_buf, size = u32(indices_byte_size)}, + false, + ) } sdl.ReleaseGPUTransferBuffer(gpu, transfer_buf) @@ -136,9 +153,6 @@ main :: proc() { if ev.key.scancode == .ESCAPE do break loop } } - cmd_buf := sdl.AcquireGPUCommandBuffer(gpu) - swaptex: ^sdl.GPUTexture - ok = sdl.WaitAndAcquireGPUSwapchainTexture(cmd_buf, window, &swaptex, nil, nil);assert(ok) rotation += 1 * delta @@ -147,6 +161,11 @@ main :: proc() { linalg.matrix4_rotate_f32(rotation, {0, 1, 0}) ubo := UBO{proj * model_mat} + + cmd_buf := sdl.AcquireGPUCommandBuffer(gpu) + swaptex: ^sdl.GPUTexture + ok = sdl.WaitAndAcquireGPUSwapchainTexture(cmd_buf, window, &swaptex, nil, nil);assert(ok) + if swaptex != nil { color_target := sdl.GPUColorTargetInfo { texture = swaptex, @@ -163,8 +182,10 @@ main :: proc() { &(sdl.GPUBufferBinding{buffer = vertex_buf}), 1, ) + sdl.BindGPUIndexBuffer(render_pass, {buffer = index_buf}, ._16BIT) sdl.PushGPUVertexUniformData(cmd_buf, 0, &ubo, size_of(ubo)) - sdl.DrawGPUPrimitives(render_pass, u32(len(vertices)), 1, 0, 0) + // sdl.DrawGPUPrimitives(render_pass, u32(len(vertices)), 1, 0, 0) + sdl.DrawGPUIndexedPrimitives(render_pass, 6, 1, 0, 0, 0) sdl.EndGPURenderPass(render_pass) }