Gpu cleanup

This commit is contained in:
luboslenco
2025-07-21 15:36:06 +02:00
parent bada1a8788
commit b08c31f966
5 changed files with 58 additions and 84 deletions
+8 -23
View File
@@ -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,
+5 -20
View File
@@ -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<MTLBuffer>)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<MTLBuffer> buffer = (__bridge id<MTLBuffer>)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) {
+2 -17
View File
@@ -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,
+40
View File
@@ -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;
}
}
+3 -24
View File
@@ -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;