Gpu cleanup
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user