This commit is contained in:
luboslenco
2025-02-11 11:04:27 +01:00
parent bf450eaa49
commit a0d717dbfc
17 changed files with 25 additions and 42 deletions
@@ -3,13 +3,11 @@
#include <kinc/backend/SystemMicrosoft.h>
#include <kinc/graphics5/indexbuffer.h>
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, kinc_g5_index_buffer_format_t format, bool gpuMemory) {
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, bool gpuMemory) {
buffer->impl.count = count;
buffer->impl.gpu_memory = gpuMemory;
buffer->impl.format = format;
// static_assert(sizeof(D3D12IindexBufferView) == sizeof(D3D12_INDEX_BUFFER_VIEW), "Something is wrong with D3D12IindexBufferView");
int uploadBufferSize = format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? sizeof(uint16_t) * count : sizeof(uint32_t) * count;
int uploadBufferSize = sizeof(uint32_t) * count;
D3D12_HEAP_PROPERTIES heapProperties;
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
@@ -51,7 +49,7 @@ void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, kinc_g
buffer->impl.index_buffer_view.BufferLocation = buffer->impl.upload_buffer->GetGPUVirtualAddress();
}
buffer->impl.index_buffer_view.SizeInBytes = uploadBufferSize;
buffer->impl.index_buffer_view.Format = format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT;
buffer->impl.index_buffer_view.Format = DXGI_FORMAT_R32_UINT;
buffer->impl.last_start = 0;
buffer->impl.last_count = kinc_g5_index_buffer_count(buffer);
@@ -110,9 +108,7 @@ void kinc_g5_internal_index_buffer_upload(kinc_g5_index_buffer_t *buffer, ID3D12
if (!buffer->impl.gpu_memory)
return;
commandList->CopyBufferRegion(buffer->impl.index_buffer, 0, buffer->impl.upload_buffer, 0,
buffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? sizeof(uint16_t) * buffer->impl.count
: sizeof(uint32_t) * buffer->impl.count);
commandList->CopyBufferRegion(buffer->impl.index_buffer, 0, buffer->impl.upload_buffer, 0, sizeof(uint32_t) * buffer->impl.count);
D3D12_RESOURCE_BARRIER barriers[1] = {};
barriers[0].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
@@ -18,7 +18,6 @@ typedef struct {
struct ID3D12Resource *upload_buffer;
int count;
bool gpu_memory;
int format;
int last_start;
int last_count;
} IndexBuffer5Impl;
@@ -508,7 +508,7 @@ void kinc_raytrace_acceleration_structure_build(kinc_raytrace_acceleration_struc
geometryDesc.Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
geometryDesc.Triangles.IndexBuffer = ib[i]->impl.upload_buffer->GetGPUVirtualAddress();
geometryDesc.Triangles.IndexCount = ib[i]->impl.count;
geometryDesc.Triangles.IndexFormat = ib[i]->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT;
geometryDesc.Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
geometryDesc.Triangles.Transform3x4 = 0;
geometryDesc.Triangles.VertexFormat = DXGI_FORMAT_R16G16B16A16_SNORM;
geometryDesc.Triangles.VertexCount = vb[i]->impl.myCount;
@@ -4,8 +4,8 @@
extern kinc_g5_command_list_t commandList;
void kinc_g4_index_buffer_init(kinc_g4_index_buffer_t *buffer, int count, kinc_g4_index_buffer_format_t format, kinc_g4_usage_t usage) {
kinc_g5_index_buffer_init(&buffer->impl._buffer, count, (kinc_g5_index_buffer_format_t)format, usage == KINC_G4_USAGE_STATIC);
void kinc_g4_index_buffer_init(kinc_g4_index_buffer_t *buffer, int count, kinc_g4_usage_t usage) {
kinc_g5_index_buffer_init(&buffer->impl._buffer, count, usage == KINC_G4_USAGE_STATIC);
}
void kinc_g4_index_buffer_destroy(kinc_g4_index_buffer_t *buffer) {
@@ -74,7 +74,7 @@ void kinc_g5_command_list_draw_indexed_vertices_from_to(kinc_g5_command_list_t *
id<MTLRenderCommandEncoder> encoder = getMetalEncoder();
[encoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
indexCount:count
indexType:(list->impl.current_index_buffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32)
indexType:MTLIndexTypeUInt32
indexBuffer:indexBuffer
indexBufferOffset:start * 4];
}
@@ -4,7 +4,6 @@ typedef struct {
void *metal_buffer;
int count;
bool gpu_memory;
int format;
int last_start;
int last_count;
} IndexBuffer5Impl;
@@ -5,10 +5,9 @@
id getMetalDevice(void);
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int indexCount, kinc_g5_index_buffer_format_t format, bool gpuMemory) {
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int indexCount, bool gpuMemory) {
buffer->impl.count = indexCount;
buffer->impl.gpu_memory = gpuMemory;
buffer->impl.format = format;
buffer->impl.last_start = 0;
buffer->impl.last_count = indexCount;
@@ -17,7 +16,7 @@ void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int indexCount, k
options |= MTLResourceStorageModeShared;
buffer->impl.metal_buffer = (__bridge_retained void *)[device
newBufferWithLength:(format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? sizeof(uint16_t) * indexCount : sizeof(uint32_t) * indexCount)
newBufferWithLength:sizeof(uint32_t) * indexCount
options:options];
}
@@ -28,7 +27,7 @@ void kinc_g5_index_buffer_destroy(kinc_g5_index_buffer_t *buffer) {
}
static int kinc_g5_internal_index_buffer_stride(kinc_g5_index_buffer_t *buffer) {
return buffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? 2 : 4;
return 4;
}
void *kinc_g5_index_buffer_lock_all(kinc_g5_index_buffer_t *buffer) {
@@ -454,8 +454,7 @@ void kinc_g5_command_list_set_vertex_buffer(kinc_g5_command_list_t *list, struct
void kinc_g5_command_list_set_index_buffer(kinc_g5_command_list_t *list, struct kinc_g5_index_buffer *indexBuffer) {
list->impl._indexCount = kinc_g5_index_buffer_count(indexBuffer);
vkCmdBindIndexBuffer(list->impl._buffer, indexBuffer->impl.buf, 0,
indexBuffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32);
vkCmdBindIndexBuffer(list->impl._buffer, indexBuffer->impl.buf, 0, VK_INDEX_TYPE_UINT32);
}
void kinc_internal_restore_render_target(kinc_g5_command_list_t *list, struct kinc_g5_render_target *target) {
@@ -7,14 +7,13 @@ bool memory_type_from_properties(uint32_t typeBits, VkFlags requirements_mask, u
static void unset(kinc_g5_index_buffer_t *buffer) {
}
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int indexCount, kinc_g5_index_buffer_format_t format, bool gpuMemory) {
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int indexCount, bool gpuMemory) {
buffer->impl.count = indexCount;
buffer->impl.format = format;
VkBufferCreateInfo buf_info = {0};
buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.pNext = NULL;
buf_info.size = format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? indexCount * sizeof(uint16_t) : indexCount * sizeof(uint32_t);
buf_info.size = indexCount * sizeof(uint32_t);
buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
if (kinc_g5_supports_raytracing()) {
@@ -65,7 +64,7 @@ void kinc_g5_index_buffer_destroy(kinc_g5_index_buffer_t *buffer) {
}
static int kinc_g5_internal_index_buffer_stride(kinc_g5_index_buffer_t *buffer) {
return buffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? 2 : 4;
return 4;
}
void *kinc_g5_index_buffer_lock_all(kinc_g5_index_buffer_t *buffer) {
@@ -4,8 +4,6 @@
typedef struct {
int count;
int format;
VkBuffer buf;
VkDeviceMemory mem;
VkMemoryAllocateInfo mem_alloc;
@@ -85,7 +85,7 @@ void kinc_g5_command_list_set_vertex_buffer(kinc_g5_command_list_t *list, struct
void kinc_g5_command_list_set_index_buffer(kinc_g5_command_list_t *list, struct kinc_g5_index_buffer *buffer) {
list->impl.indexCount = kinc_g5_index_buffer_count(buffer);
uint64_t size = kinc_g5_index_buffer_count(buffer) * sizeof(int);
wgpuRenderPassEncoderSetIndexBuffer(list->impl.pass, buffer->impl.buffer, buffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? WGPUIndexFormat_Uint16 : WGPUIndexFormat_Uint32, 0, size);
wgpuRenderPassEncoderSetIndexBuffer(list->impl.pass, buffer->impl.buffer, WGPUIndexFormat_Uint32, 0, size);
}
void kinc_g5_command_list_set_render_targets(kinc_g5_command_list_t *list, struct kinc_g5_render_target **targets, int count) {
@@ -8,9 +8,8 @@ extern WGPUDevice device;
kinc_g5_index_buffer_t *kinc_g5_internal_current_index_buffer = NULL;
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, kinc_g5_index_buffer_format_t format, bool gpuMemory) {
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, bool gpuMemory) {
buffer->impl.count = count;
buffer->impl.format = format;
}
void kinc_g5_index_buffer_destroy(kinc_g5_index_buffer_t *buffer) {
@@ -18,7 +17,7 @@ void kinc_g5_index_buffer_destroy(kinc_g5_index_buffer_t *buffer) {
}
static int kinc_g5_internal_index_buffer_stride(kinc_g5_index_buffer_t *buffer) {
return buffer->impl.format == KINC_G5_INDEX_BUFFER_FORMAT_16BIT ? 2 : 4;
return 4;
}
void *kinc_g5_index_buffer_lock_all(kinc_g5_index_buffer_t *buffer) {
@@ -5,5 +5,4 @@
typedef struct {
WGPUBuffer buffer;
int count;
int format;
} IndexBuffer5Impl;
+1 -1
View File
@@ -1022,7 +1022,7 @@ void iron_show_keyboard(bool show) {
any iron_g4_create_index_buffer(i32 count) {
kinc_g4_index_buffer_t *buffer = (kinc_g4_index_buffer_t *)malloc(sizeof(kinc_g4_index_buffer_t));
kinc_g4_index_buffer_init(buffer, count, KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_USAGE_STATIC);
kinc_g4_index_buffer_init(buffer, count, KINC_G4_USAGE_STATIC);
return buffer;
}
+4 -4
View File
@@ -168,7 +168,7 @@ void kinc_g2_init(buffer_t *image_vert, buffer_t *image_frag, buffer_t *colored_
kinc_g4_vertex_buffer_init(&image_vertex_buffer, G2_BUFFER_SIZE * 4, &structure, KINC_G4_USAGE_DYNAMIC);
image_rect_verts = kinc_g4_vertex_buffer_lock_all(&image_vertex_buffer);
kinc_g4_index_buffer_init(&image_index_buffer, G2_BUFFER_SIZE * 3 * 2, KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_USAGE_STATIC);
kinc_g4_index_buffer_init(&image_index_buffer, G2_BUFFER_SIZE * 3 * 2, KINC_G4_USAGE_STATIC);
int *indices = kinc_g4_index_buffer_lock_all(&image_index_buffer);
for (int i = 0; i < G2_BUFFER_SIZE; ++i) {
indices[i * 3 * 2 + 0] = i * 4 + 0;
@@ -206,7 +206,7 @@ void kinc_g2_init(buffer_t *image_vert, buffer_t *image_frag, buffer_t *colored_
kinc_g4_vertex_buffer_init(&colored_rect_vertex_buffer, G2_BUFFER_SIZE * 4, &structure, KINC_G4_USAGE_DYNAMIC);
colored_rect_verts = kinc_g4_vertex_buffer_lock_all(&colored_rect_vertex_buffer);
kinc_g4_index_buffer_init(&colored_rect_index_buffer, G2_BUFFER_SIZE * 3 * 2, KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_USAGE_STATIC);
kinc_g4_index_buffer_init(&colored_rect_index_buffer, G2_BUFFER_SIZE * 3 * 2, KINC_G4_USAGE_STATIC);
int *indices = kinc_g4_index_buffer_lock_all(&colored_rect_index_buffer);
for (int i = 0; i < G2_BUFFER_SIZE; ++i) {
indices[i * 3 * 2 + 0] = i * 4 + 0;
@@ -221,7 +221,7 @@ void kinc_g2_init(buffer_t *image_vert, buffer_t *image_frag, buffer_t *colored_
kinc_g4_vertex_buffer_init(&colored_tris_vertex_buffer, G2_BUFFER_SIZE * 3, &structure, KINC_G4_USAGE_DYNAMIC);
colored_tris_verts = kinc_g4_vertex_buffer_lock_all(&colored_tris_vertex_buffer);
kinc_g4_index_buffer_init(&colored_tris_index_buffer, G2_BUFFER_SIZE * 3, KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_USAGE_STATIC);
kinc_g4_index_buffer_init(&colored_tris_index_buffer, G2_BUFFER_SIZE * 3, KINC_G4_USAGE_STATIC);
indices = kinc_g4_index_buffer_lock_all(&colored_tris_index_buffer);
for (int i = 0; i < G2_BUFFER_SIZE; ++i) {
indices[i * 3 + 0] = i * 3 + 0;
@@ -267,7 +267,7 @@ void kinc_g2_init(buffer_t *image_vert, buffer_t *image_frag, buffer_t *colored_
kinc_g4_vertex_buffer_init(&text_vertex_buffer, G2_BUFFER_SIZE * 4, &structure, KINC_G4_USAGE_DYNAMIC);
text_rect_verts = kinc_g4_vertex_buffer_lock_all(&text_vertex_buffer);
kinc_g4_index_buffer_init(&text_index_buffer, G2_BUFFER_SIZE * 3 * 2, KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_USAGE_STATIC);
kinc_g4_index_buffer_init(&text_index_buffer, G2_BUFFER_SIZE * 3 * 2, KINC_G4_USAGE_STATIC);
int *indices = kinc_g4_index_buffer_lock_all(&text_index_buffer);
for (int i = 0; i < G2_BUFFER_SIZE; ++i) {
indices[i * 3 * 2 + 0] = i * 4 + 0;
@@ -10,13 +10,11 @@
\brief Provides functions for setting up and using index-buffers.
*/
typedef enum kinc_g4_index_buffer_format { KINC_G4_INDEX_BUFFER_FORMAT_32BIT, KINC_G4_INDEX_BUFFER_FORMAT_16BIT } kinc_g4_index_buffer_format_t;
typedef struct kinc_g4_index_buffer {
kinc_g4_index_buffer_impl_t impl;
} kinc_g4_index_buffer_t;
void kinc_g4_index_buffer_init(kinc_g4_index_buffer_t *buffer, int count, kinc_g4_index_buffer_format_t format, kinc_g4_usage_t usage);
void kinc_g4_index_buffer_init(kinc_g4_index_buffer_t *buffer, int count, kinc_g4_usage_t usage);
void kinc_g4_index_buffer_destroy(kinc_g4_index_buffer_t *buffer);
void *kinc_g4_index_buffer_lock_all(kinc_g4_index_buffer_t *buffer);
void *kinc_g4_index_buffer_lock(kinc_g4_index_buffer_t *buffer, int start, int count);
@@ -8,13 +8,11 @@
\brief Provides functions for setting up and using index-buffers.
*/
typedef enum kinc_g5_index_buffer_format { KINC_G5_INDEX_BUFFER_FORMAT_32BIT, KINC_G5_INDEX_BUFFER_FORMAT_16BIT } kinc_g5_index_buffer_format_t;
typedef struct kinc_g5_index_buffer {
IndexBuffer5Impl impl;
} kinc_g5_index_buffer_t;
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, kinc_g5_index_buffer_format_t format, bool gpu_memory);
void kinc_g5_index_buffer_init(kinc_g5_index_buffer_t *buffer, int count, bool gpu_memory);
void kinc_g5_index_buffer_destroy(kinc_g5_index_buffer_t *buffer);
void *kinc_g5_index_buffer_lock_all(kinc_g5_index_buffer_t *buffer);
void *kinc_g5_index_buffer_lock(kinc_g5_index_buffer_t *buffer, int start, int count);