diff --git a/base/sources/backends/direct3d12_gpu.c b/base/sources/backends/direct3d12_gpu.c index 68bc4832..f48c789b 100644 --- a/base/sources/backends/direct3d12_gpu.c +++ b/base/sources/backends/direct3d12_gpu.c @@ -105,21 +105,6 @@ static DXGI_FORMAT convert_format(gpu_texture_format_t format) { } } -static int format_size(DXGI_FORMAT format) { - switch (format) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: - return 16; - case DXGI_FORMAT_R16G16B16A16_FLOAT: - return 8; - case DXGI_FORMAT_R16_FLOAT: - return 2; - case DXGI_FORMAT_R8_UNORM: - return 1; - default: - return 4; - } -} - static D3D12_RESOURCE_STATES convert_texture_state(gpu_texture_state_t state) { switch (state) { case GPU_TEXTURE_STATE_SHADER_RESOURCE: @@ -591,8 +576,8 @@ void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { D3D12_RESOURCE_DESC desc; render_target->impl.image->lpVtbl->GetDesc(render_target->impl.image, &desc); DXGI_FORMAT dxgi_format = desc.Format; - int _format_size = format_size(dxgi_format); - int row_pitch = render_target->width * _format_size; + int format_size = gpu_texture_format_size(render_target->format); + int row_pitch = render_target->width * format_size; int align = row_pitch % D3D12_TEXTURE_DATA_PITCH_ALIGNMENT; if (align != 0) { row_pitch = row_pitch + (D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - align); @@ -678,7 +663,7 @@ void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { // Read buffer void *p; readback_buffer->lpVtbl->Map(readback_buffer, 0, NULL, &p); - memcpy(data, p, render_target->width * render_target->height * _format_size); + memcpy(data, p, render_target->width * render_target->height * format_size); readback_buffer->lpVtbl->Unmap(readback_buffer, 0, NULL); } @@ -815,8 +800,8 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, texture->format = format; texture->state = GPU_TEXTURE_STATE_SHADER_RESOURCE; texture->buffer = NULL; - DXGI_FORMAT d3d_format = convert_format(format); - int _format_size = format_size(d3d_format); + DXGI_FORMAT dxgi_format = convert_format(format); + int format_size = gpu_texture_format_size(format); D3D12_HEAP_PROPERTIES heap_properties = { .Type = D3D12_HEAP_TYPE_DEFAULT, @@ -833,7 +818,7 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, .Height = texture->height, .DepthOrArraySize = 1, .MipLevels = 1, - .Format = d3d_format, + .Format = dxgi_format, .SampleDesc.Count = 1, .SampleDesc.Quality = 0, .Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, @@ -887,7 +872,7 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, BYTE *pixel; upload_buffer->lpVtbl->Map(upload_buffer, 0, NULL, (void **)&pixel); for (int y = 0; y < texture->height; ++y) { - memcpy(&pixel[y * stride], &((uint8_t *)data)[y * texture->width * _format_size], texture->width * _format_size); + memcpy(&pixel[y * stride], &((uint8_t *)data)[y * texture->width * format_size], texture->width * format_size); } upload_buffer->lpVtbl->Unmap(upload_buffer, 0, NULL); @@ -902,7 +887,7 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc = { .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D, .Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING, - .Format = d3d_format, + .Format = dxgi_format, .Texture2D.MipLevels = 1, .Texture2D.MostDetailedMip = 0, .Texture2D.ResourceMinLODClamp = 0.0f, diff --git a/base/sources/backends/metal_gpu.m b/base/sources/backends/metal_gpu.m index 36283f37..2c6070a1 100644 --- a/base/sources/backends/metal_gpu.m +++ b/base/sources/backends/metal_gpu.m @@ -93,21 +93,6 @@ static MTLPixelFormat convert_texture_format(gpu_texture_format_t format) { } } -static int format_byte_size(gpu_texture_format_t format) { - switch (format) { - case GPU_TEXTURE_FORMAT_RGBA128: - return 16; - case GPU_TEXTURE_FORMAT_RGBA64: - return 8; - case GPU_TEXTURE_FORMAT_R16: - return 2; - case GPU_TEXTURE_FORMAT_R8: - return 1; - default: - return 4; - } -} - void gpu_render_target_init2(gpu_texture_t *target, int width, int height, gpu_texture_format_t format, int framebuffer_index) { target->width = width; target->height = height; @@ -359,7 +344,7 @@ void gpu_set_index_buffer(gpu_buffer_t *buffer) { void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { gpu_execute_and_wait(); - int buffer_size = render_target->width * render_target->height * format_byte_size(render_target->format); + int buffer_size = render_target->width * render_target->height * gpu_texture_format_size(render_target->format); int new_readback_buffer_size = buffer_size; if (new_readback_buffer_size < (2048 * 2048 * 4)) { new_readback_buffer_size = (2048 * 2048 * 4); @@ -385,7 +370,7 @@ void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { sourceSize:MTLSizeMake(render_target->width, render_target->height, 1) toBuffer:(__bridge id)readback_buffer destinationOffset:0 - destinationBytesPerRow:render_target->width * format_byte_size(render_target->format) + destinationBytesPerRow:render_target->width * gpu_texture_format_size(render_target->format) destinationBytesPerImage:0]; [command_encoder endEncoding]; [command_buffer commit]; @@ -393,7 +378,7 @@ void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { // Read buffer id buffer = (__bridge id)readback_buffer; - memcpy(data, [buffer contents], render_target->width * render_target->height * format_byte_size(render_target->format)); + memcpy(data, [buffer contents], render_target->width * render_target->height * gpu_texture_format_size(render_target->format)); } void gpu_set_constant_buffer(gpu_buffer_t *buffer, int offset, size_t size) { @@ -568,8 +553,8 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, mipmapLevel:0 slice:0 withBytes:data - bytesPerRow:width * format_byte_size(format) - bytesPerImage:width * format_byte_size(format) * height]; + bytesPerRow:width * gpu_texture_format_size(format) + bytesPerImage:width * gpu_texture_format_size(format) * height]; } void gpu_texture_destroy(gpu_texture_t *target) { diff --git a/base/sources/backends/vulkan_gpu.c b/base/sources/backends/vulkan_gpu.c index 9fb8dbdd..fe64869c 100644 --- a/base/sources/backends/vulkan_gpu.c +++ b/base/sources/backends/vulkan_gpu.c @@ -84,21 +84,6 @@ static VkFormat convert_image_format(gpu_texture_format_t format) { } } -static int format_size(gpu_texture_format_t format) { - switch (format) { - case GPU_TEXTURE_FORMAT_RGBA128: - return 16; - case GPU_TEXTURE_FORMAT_RGBA64: - return 8; - case GPU_TEXTURE_FORMAT_R16: - return 2; - case GPU_TEXTURE_FORMAT_R8: - return 1; - default: - return 4; - } -} - static VkCullModeFlagBits convert_cull_mode(gpu_cull_mode_t cull_mode) { switch (cull_mode) { case GPU_CULL_MODE_CLOCKWISE: @@ -1304,7 +1289,7 @@ void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { vkCmdEndRendering(command_buffer); } - int buffer_size = render_target->width * render_target->height * format_size(render_target->format); + int buffer_size = render_target->width * render_target->height * gpu_texture_format_size(render_target->format); int new_readback_buffer_size = buffer_size; if (new_readback_buffer_size < (2048 * 2048 * 4)) { new_readback_buffer_size = (2048 * 2048 * 4); @@ -1651,7 +1636,7 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, vk_format = VK_FORMAT_R8G8B8A8_UNORM; } - VkDeviceSize buffer_size = width * height * format_size(format); + VkDeviceSize buffer_size = width * height * gpu_texture_format_size(format); VkBufferCreateInfo buffer_info = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .size = buffer_size, diff --git a/base/sources/iron_gpu.c b/base/sources/iron_gpu.c index 50629ea4..e451a3ef 100644 --- a/base/sources/iron_gpu.c +++ b/base/sources/iron_gpu.c @@ -253,3 +253,43 @@ void gpu_create_framebuffers(int depth_buffer_bits) { framebuffer_depth.width = framebuffer_depth.height = 0; } } + +int gpu_vertex_data_size(gpu_vertex_data_t data) { + switch (data) { + case GPU_VERTEX_DATA_F32_1X: + return 1 * 4; + case GPU_VERTEX_DATA_F32_2X: + return 2 * 4; + case GPU_VERTEX_DATA_F32_3X: + return 3 * 4; + case GPU_VERTEX_DATA_F32_4X: + return 4 * 4; + case GPU_VERTEX_DATA_I16_2X_NORM: + return 2 * 2; + case GPU_VERTEX_DATA_I16_4X_NORM: + return 4 * 2; + } +} + +int gpu_vertex_struct_size(gpu_vertex_structure_t *s) { + int size = 0; + for (int i = 0; i < s->size; ++i) { + size += gpu_vertex_data_size(s->elements[i].data); + } + return size; +} + +int gpu_texture_format_size(gpu_texture_format_t format) { + switch (format) { + case GPU_TEXTURE_FORMAT_RGBA128: + return 16; + case GPU_TEXTURE_FORMAT_RGBA64: + return 8; + case GPU_TEXTURE_FORMAT_R16: + return 2; + case GPU_TEXTURE_FORMAT_R8: + return 1; + default: + return 4; + } +} diff --git a/base/sources/iron_gpu.h b/base/sources/iron_gpu.h index 13e84e9d..7ed6f783 100644 --- a/base/sources/iron_gpu.h +++ b/base/sources/iron_gpu.h @@ -217,30 +217,9 @@ void gpu_raytrace_set_pipeline(gpu_raytrace_pipeline_t *pipeline); void gpu_raytrace_set_target(gpu_texture_t *output); void gpu_raytrace_dispatch_rays(); -static inline int gpu_vertex_data_size(gpu_vertex_data_t data) { - switch (data) { - case GPU_VERTEX_DATA_F32_1X: - return 1 * 4; - case GPU_VERTEX_DATA_F32_2X: - return 2 * 4; - case GPU_VERTEX_DATA_F32_3X: - return 3 * 4; - case GPU_VERTEX_DATA_F32_4X: - return 4 * 4; - case GPU_VERTEX_DATA_I16_2X_NORM: - return 2 * 2; - case GPU_VERTEX_DATA_I16_4X_NORM: - return 4 * 2; - } -} - -static inline int gpu_vertex_struct_size(gpu_vertex_structure_t *s) { - int size = 0; - for (int i = 0; i < s->size; ++i) { - size += gpu_vertex_data_size(s->elements[i].data); - } - return size; -} +int gpu_vertex_data_size(gpu_vertex_data_t data); +int gpu_vertex_struct_size(gpu_vertex_structure_t *s); +int gpu_texture_format_size(gpu_texture_format_t format); extern bool gpu_transpose_mat; extern bool gpu_in_use;