From ebdd6027414b2f86f118773d06bd6a415add34c0 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 10 Jul 2025 16:35:19 +0200 Subject: [PATCH] Gpu cleanup --- base/assets/Scene.arm | Bin 178091 -> 178056 bytes base/sources/backends/direct3d12_gpu.c | 63 ++------- base/sources/backends/direct3d12_gpu.h | 1 - base/sources/backends/metal_gpu.h | 1 - base/sources/backends/metal_gpu.m | 106 ++------------ base/sources/backends/vulkan_gpu.c | 185 +++++++------------------ base/sources/backends/vulkan_gpu.h | 3 - base/sources/backends/webgpu_gpu.c | 1 - base/sources/iron.h | 44 +++--- base/sources/iron_gpu.h | 2 - base/sources/iron_system.c | 2 - base/sources/ts/import_envmap.ts | 1 - base/sources/ts/iron/iron.ts | 2 +- base/sources/ts/iron/material_data.ts | 23 --- base/sources/ts/iron/render_path.ts | 2 - base/sources/ts/iron/scene.ts | 2 - base/sources/ts/iron/world_data.ts | 1 - base/sources/ts/parser_material.ts | 3 - base/sources/ts/util_clone.ts | 2 - 19 files changed, 90 insertions(+), 354 deletions(-) diff --git a/base/assets/Scene.arm b/base/assets/Scene.arm index ba6508bce6f5fffdc33d001d5b1d0765a0cc3bb1..0979d79888c342ad9948b1ea6696579721f2ae9e 100644 GIT binary patch delta 34 pcmZ4eo~z?MS3?Wq7N!Nur~lZ*q|BL?nUi{(0SLCgU(U3L9{>xD4lDow delta 62 zcmeBp&$aqJS3?Wq7N!Nu8Cj+;T+XDed|QBlfgwFLFSRJKBsD%avmiIIp!mRTcAzMX Lv;E9+rak-s^I8}< diff --git a/base/sources/backends/direct3d12_gpu.c b/base/sources/backends/direct3d12_gpu.c index 47551f75..b21b77e5 100644 --- a/base/sources/backends/direct3d12_gpu.c +++ b/base/sources/backends/direct3d12_gpu.c @@ -13,8 +13,6 @@ #include #include -void iron_memory_emergency(); - bool gpu_transpose_mat = false; static ID3D12Device *device = NULL; static ID3D12CommandQueue *queue; @@ -177,7 +175,6 @@ void gpu_render_target_init2(gpu_texture_t *render_target, int width, int height render_target->width = width; render_target->height = height; render_target->impl.readback = NULL; - render_target->data = NULL; render_target->state = (framebuffer_index >= 0) ? GPU_TEXTURE_STATE_PRESENT : GPU_TEXTURE_STATE_SHADER_RESOURCE; DXGI_FORMAT dxgi_format = convert_format(format); @@ -223,18 +220,8 @@ void gpu_render_target_init2(gpu_texture_t *render_target, int width, int height window_swapchain->lpVtbl->GetBuffer(window_swapchain, framebuffer_index, &IID_ID3D12Resource, &render_target->impl.image); } else { - HRESULT result = device->lpVtbl->CreateCommittedResource(device, &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, - &clear_value, &IID_ID3D12Resource, &render_target->impl.image); - if (result != S_OK) { - for (int i = 0; i < 10; ++i) { - iron_memory_emergency(); - result = device->lpVtbl->CreateCommittedResource(device, &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, - &clear_value, &IID_ID3D12Resource, &render_target->impl.image); - if (result == S_OK) { - break; - } - } - } + device->lpVtbl->CreateCommittedResource(device, &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, + &clear_value, &IID_ID3D12Resource, &render_target->impl.image); } D3D12_RENDER_TARGET_VIEW_DESC view_desc = { @@ -816,7 +803,6 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, texture->width = width; texture->height = height; texture->format = format; - texture->data = data; texture->state = GPU_TEXTURE_STATE_SHADER_RESOURCE; DXGI_FORMAT d3d_format = convert_format(format); int _format_size = format_size(d3d_format); @@ -843,20 +829,9 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, .Flags = D3D12_RESOURCE_FLAG_NONE, }; - HRESULT result = device->lpVtbl->CreateCommittedResource(device, &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc, + device->lpVtbl->CreateCommittedResource(device, &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, NULL, &IID_ID3D12Resource, &texture->impl.image); - if (result != S_OK) { - for (int i = 0; i < 10; ++i) { - iron_memory_emergency(); - result = device->lpVtbl->CreateCommittedResource(device, &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc, - D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, NULL, &IID_ID3D12Resource, &texture->impl.image); - if (result == S_OK) { - break; - } - } - } - D3D12_HEAP_PROPERTIES heap_properties_upload = { .Type = D3D12_HEAP_TYPE_UPLOAD, .CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN, @@ -866,7 +841,7 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, }; D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint; - UINT64 upload_buffer_size = 0; + UINT64 upload_buffer_size; device->lpVtbl->GetCopyableFootprints(device, &resource_desc, 0, 1, 0, &footprint, NULL, NULL, &upload_buffer_size); D3D12_RESOURCE_DESC resource_desc_upload = { @@ -884,27 +859,15 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, }; struct ID3D12Resource *upload_image; - - result = device->lpVtbl->CreateCommittedResource(device, &heap_properties_upload, D3D12_HEAP_FLAG_NONE, &resource_desc_upload, + device->lpVtbl->CreateCommittedResource(device, &heap_properties_upload, D3D12_HEAP_FLAG_NONE, &resource_desc_upload, D3D12_RESOURCE_STATE_GENERIC_READ, NULL, &IID_ID3D12Resource, &upload_image); - if (result != S_OK) { - for (int i = 0; i < 10; ++i) { - iron_memory_emergency(); - result = device->lpVtbl->CreateCommittedResource(device, &heap_properties_upload, D3D12_HEAP_FLAG_NONE, &resource_desc_upload, - D3D12_RESOURCE_STATE_GENERIC_READ, NULL, &IID_ID3D12Resource, &upload_image); - if (result == S_OK) { - break; - } - } - } - - texture->impl.stride = (int)ceilf(upload_buffer_size / (float)(height * D3D12_TEXTURE_DATA_PITCH_ALIGNMENT)) * D3D12_TEXTURE_DATA_PITCH_ALIGNMENT; + int stride = (int)ceilf(upload_buffer_size / (float)(height * D3D12_TEXTURE_DATA_PITCH_ALIGNMENT)) * D3D12_TEXTURE_DATA_PITCH_ALIGNMENT; BYTE *pixel; upload_image->lpVtbl->Map(upload_image, 0, NULL, (void **)&pixel); for (int y = 0; y < texture->height; ++y) { - memcpy(&pixel[y * texture->impl.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_image->lpVtbl->Unmap(upload_image, 0, NULL); @@ -953,14 +916,8 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, command_list->lpVtbl->CopyTextureRegion(command_list, &destination, 0, 0, 0, &source, NULL); - barrier = (D3D12_RESOURCE_BARRIER){ - .Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION, - .Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE, - .Transition.pResource = texture->impl.image, - .Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST, - .Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, - .Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, - }; + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST, + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, command_list->lpVtbl->ResourceBarrier(command_list, 1, &barrier); // TODO: @@ -983,8 +940,6 @@ void gpu_texture_destroy(gpu_texture_t *render_target) { } } -void gpu_texture_set_mipmap(gpu_texture_t *texture, gpu_texture_t *mipmap, int level) {} - void gpu_render_target_init(gpu_texture_t *target, int width, int height, gpu_texture_format_t format) { gpu_render_target_init2(target, width, height, format, -1); } diff --git a/base/sources/backends/direct3d12_gpu.h b/base/sources/backends/direct3d12_gpu.h index 4a7a4b22..f55b0d49 100644 --- a/base/sources/backends/direct3d12_gpu.h +++ b/base/sources/backends/direct3d12_gpu.h @@ -55,7 +55,6 @@ typedef struct { struct ID3D12Resource *readback; struct ID3D12DescriptorHeap *srv_descriptor_heap; struct ID3D12DescriptorHeap *rtv_descriptor_heap; - int stride; } gpu_texture_impl_t; typedef struct { diff --git a/base/sources/backends/metal_gpu.h b/base/sources/backends/metal_gpu.h index 815a629d..275ccd06 100644 --- a/base/sources/backends/metal_gpu.h +++ b/base/sources/backends/metal_gpu.h @@ -22,7 +22,6 @@ typedef struct { typedef struct { void *_tex; void *data; - bool has_mipmaps; void *_texReadback; } gpu_texture_impl_t; diff --git a/base/sources/backends/metal_gpu.m b/base/sources/backends/metal_gpu.m index 492c7c15..9a6d2c9a 100644 --- a/base/sources/backends/metal_gpu.m +++ b/base/sources/backends/metal_gpu.m @@ -147,7 +147,6 @@ void gpu_render_target_init2(gpu_texture_t *target, int width, int height, gpu_t memset(target, 0, sizeof(gpu_texture_t)); target->width = width; target->height = height; - target->data = NULL; target->state = GPU_TEXTURE_STATE_RENDER_TARGET; target->impl._texReadback = NULL; @@ -616,9 +615,11 @@ void gpu_shader_init(gpu_shader_t *shader, const void *data, size_t length, gpu_ shader->impl.length = length; } -static void create_texture(gpu_texture_t *texture, int width, int height, int format, bool writable) { - texture->impl.has_mipmaps = false; - id device = getMetalDevice(); +void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, int height, gpu_texture_format_t format) { + texture->width = width; + texture->height = height; + texture->format = format; + texture->state = GPU_TEXTURE_STATE_SHADER_RESOURCE; MTLTextureDescriptor *descriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:convert_image_format((gpu_texture_format_t)format) width:width @@ -631,43 +632,17 @@ static void create_texture(gpu_texture_t *texture, int width, int height, int fo descriptor.pixelFormat = convert_image_format((gpu_texture_format_t)format); descriptor.arrayLength = 1; descriptor.mipmapLevelCount = 1; - // TODO: Make less textures writable - if (writable) { - descriptor.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead; - } + descriptor.usage = MTLTextureUsageShaderRead; // MTLTextureUsageShaderWrite + id device = getMetalDevice(); texture->impl._tex = (__bridge_retained void *)[device newTextureWithDescriptor:descriptor]; -} -int gpu_texture_stride(gpu_texture_t *texture) { - switch (texture->format) { - case GPU_TEXTURE_FORMAT_R8: - return texture->width; - case GPU_TEXTURE_FORMAT_RGBA32: - default: - return texture->width * 4; - case GPU_TEXTURE_FORMAT_RGBA64: - return texture->width * 8; - case GPU_TEXTURE_FORMAT_RGBA128: - return texture->width * 16; - } -} - -void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, int height, gpu_texture_format_t format) { - texture->width = width; - texture->height = height; - texture->format = format; - texture->data = data; - texture->impl.data = NULL; - texture->state = GPU_TEXTURE_STATE_SHADER_RESOURCE; - create_texture(texture, width, height, format, true); - id tex = (__bridge id)texture->impl._tex; - [tex replaceRegion:MTLRegionMake2D(0, 0, texture->width, texture->height) - mipmapLevel:0 - slice:0 - withBytes:data - bytesPerRow:gpu_texture_stride(texture) - bytesPerImage:gpu_texture_stride(texture) * texture->height]; + [texture->impl._tex replaceRegion:MTLRegionMake2D(0, 0, width, height) + mipmapLevel:0 + slice:0 + withBytes:data + bytesPerRow:width * format_byte_size(texture) + bytesPerImage:width * format_byte_size(texture) * height]; } void gpu_texture_destroy(gpu_texture_t *target) { @@ -678,61 +653,6 @@ void gpu_texture_destroy(gpu_texture_t *target) { id texReadback = (__bridge_transfer id)target->impl._texReadback; texReadback = nil; target->impl._texReadback = NULL; - - if (target->impl.data != NULL) { - free(target->impl.data); - target->impl.data = NULL; - } -} - -void gpu_texture_set_mipmap(gpu_texture_t *texture, gpu_texture_t *mipmap, int level) { - if (!texture->impl.has_mipmaps) { - id device = getMetalDevice(); - MTLTextureDescriptor *descriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:convert_image_format((gpu_texture_format_t)texture->format) - width:texture->width - height:texture->height - mipmapped:YES]; - descriptor.textureType = MTLTextureType2D; - descriptor.width = texture->width; - descriptor.height = texture->height; - descriptor.depth = 1; - descriptor.pixelFormat = convert_image_format((gpu_texture_format_t)texture->format); - descriptor.arrayLength = 1; - bool writable = true; - if (writable) { - descriptor.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead; - } - void *mipmaptex = (__bridge_retained void *)[device newTextureWithDescriptor:descriptor]; - - id commandQueue = getMetalQueue(); - id commandBuffer = [commandQueue commandBuffer]; - id commandEncoder = [commandBuffer blitCommandEncoder]; - [commandEncoder copyFromTexture:(__bridge id)texture->impl._tex - sourceSlice:0 - sourceLevel:0 - sourceOrigin:MTLOriginMake(0, 0, 0) - sourceSize:MTLSizeMake(texture->width, texture->height, 1) - toTexture:(__bridge id)mipmaptex - destinationSlice:0 - destinationLevel:0 - destinationOrigin:MTLOriginMake(0, 0, 0)]; - - [commandEncoder endEncoding]; - [commandBuffer commit]; - [commandBuffer waitUntilCompleted]; - - id tex = (__bridge_transfer id)texture->impl._tex; - tex = nil; - texture->impl._tex = mipmaptex; - - texture->impl.has_mipmaps = true; - } - - id tex = (__bridge id)texture->impl._tex; - [tex replaceRegion:MTLRegionMake2D(0, 0, mipmap->width, mipmap->height) - mipmapLevel:level - withBytes:mipmap->data - bytesPerRow:mipmap->width * format_byte_size(mipmap->format)]; } void gpu_render_target_init(gpu_texture_t *target, int width, int height, gpu_texture_format_t format) { diff --git a/base/sources/backends/vulkan_gpu.c b/base/sources/backends/vulkan_gpu.c index 43fcfadb..fdb9c164 100644 --- a/base/sources/backends/vulkan_gpu.c +++ b/base/sources/backends/vulkan_gpu.c @@ -417,9 +417,7 @@ VkSwapchainKHR cleanup_swapchain() { 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; - target->data = NULL; target->impl.format = convert_image_format(format); - target->impl.stage = 0; target->impl.readback_buffer_created = false; target->state = (framebuffer_index >= 0) ? GPU_TEXTURE_STATE_PRESENT : GPU_TEXTURE_STATE_SHADER_RESOURCE; @@ -1453,7 +1451,6 @@ void gpu_set_constant_buffer(gpu_buffer_t *buffer, int offset, size_t size) { } void gpu_set_texture(int unit, gpu_texture_t *texture) { - texture->impl.stage = unit; current_textures[unit] = texture; } @@ -1674,8 +1671,8 @@ void gpu_shader_destroy(gpu_shader_t *shader) { shader->impl.source = NULL; } -static void prepare_texture_image(uint8_t *tex_colors, uint32_t width, uint32_t height, gpu_texture_impl_t *tex_obj, VkImageTiling tiling, - VkImageUsageFlags usage, VkFlags required_props, VkDeviceSize *deviceSize, VkFormat tex_format) { +static void prepare_texture_image(uint8_t *pixels, uint32_t width, uint32_t height, gpu_texture_impl_t *impl, VkImageTiling tiling, + VkImageUsageFlags usage, VkFlags required_props, VkFormat tex_format) { VkImageCreateInfo image_create_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, @@ -1701,15 +1698,15 @@ static void prepare_texture_image(uint8_t *tex_colors, uint32_t width, uint32_t .memoryTypeIndex = 0, }; - vkCreateImage(device, &image_create_info, NULL, &tex_obj->image); + vkCreateImage(device, &image_create_info, NULL, &impl->image); VkMemoryRequirements mem_reqs; - vkGetImageMemoryRequirements(device, tex_obj->image, &mem_reqs); - *deviceSize = mem_alloc.allocationSize = mem_reqs.size; + vkGetImageMemoryRequirements(device, impl->image, &mem_reqs); + mem_alloc.allocationSize = mem_reqs.size; memory_type_from_properties(mem_reqs.memoryTypeBits, required_props, &mem_alloc.memoryTypeIndex); - vkAllocateMemory(device, &mem_alloc, NULL, &tex_obj->mem); - vkBindImageMemory(device, tex_obj->image, tex_obj->mem, 0); + vkAllocateMemory(device, &mem_alloc, NULL, &impl->mem); + vkBindImageMemory(device, impl->image, impl->mem, 0); - if (required_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT && tex_colors != NULL) { + if (required_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { VkImageSubresource subres = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .mipLevel = 0, @@ -1718,49 +1715,37 @@ static void prepare_texture_image(uint8_t *tex_colors, uint32_t width, uint32_t VkSubresourceLayout layout; uint8_t *data; - vkGetImageSubresourceLayout(device, tex_obj->image, &subres, &layout); - vkMapMemory(device, tex_obj->mem, 0, mem_alloc.allocationSize, 0, (void **)&data); + vkGetImageSubresourceLayout(device, impl->image, &subres, &layout); + vkMapMemory(device, impl->mem, 0, mem_alloc.allocationSize, 0, (void **)&data); if (tex_format == VK_FORMAT_R8_UNORM) { for (uint32_t y = 0; y < height; y++) { for (uint32_t x = 0; x < width; x++) { - data[y * layout.rowPitch + x] = tex_colors[y * width + x]; - } - } - } - else if (tex_format == VK_FORMAT_R32_SFLOAT) { - uint32_t *data32 = (uint32_t *)data; - uint32_t *tex_colors32 = (uint32_t *)tex_colors; - for (uint32_t y = 0; y < height; y++) { - for (uint32_t x = 0; x < width; x++) { - data32[y * (layout.rowPitch / 4) + x] = tex_colors32[y * width + x]; + data[y * layout.rowPitch + x] = pixels[y * width + x]; } } } else if (tex_format == VK_FORMAT_R16_SFLOAT) { uint16_t *data16 = (uint16_t *)data; - uint16_t *tex_colors16 = (uint16_t *)tex_colors; + uint16_t *tex_colors16 = (uint16_t *)pixels; for (uint32_t y = 0; y < height; y++) { for (uint32_t x = 0; x < width; x++) { data16[y * (layout.rowPitch / 4) + x] = tex_colors16[y * width + x]; } } } - else if (tex_format == VK_FORMAT_R32G32B32A32_SFLOAT) { + else if (tex_format == VK_FORMAT_R32_SFLOAT) { uint32_t *data32 = (uint32_t *)data; - uint32_t *tex_colors32 = (uint32_t *)tex_colors; + uint32_t *tex_colors32 = (uint32_t *)pixels; for (uint32_t y = 0; y < height; y++) { for (uint32_t x = 0; x < width; x++) { - data32[y * (layout.rowPitch / 4) + x * 4 + 0] = tex_colors32[y * width * 4 + x * 4 + 0]; - data32[y * (layout.rowPitch / 4) + x * 4 + 1] = tex_colors32[y * width * 4 + x * 4 + 1]; - data32[y * (layout.rowPitch / 4) + x * 4 + 2] = tex_colors32[y * width * 4 + x * 4 + 2]; - data32[y * (layout.rowPitch / 4) + x * 4 + 3] = tex_colors32[y * width * 4 + x * 4 + 3]; + data32[y * (layout.rowPitch / 4) + x] = tex_colors32[y * width + x]; } } } else if (tex_format == VK_FORMAT_R16G16B16A16_SFLOAT) { uint16_t *data16 = (uint16_t *)data; - uint16_t *tex_colors16 = (uint16_t *)tex_colors; + uint16_t *tex_colors16 = (uint16_t *)pixels; for (uint32_t y = 0; y < height; y++) { for (uint32_t x = 0; x < width; x++) { data16[y * (layout.rowPitch / 4) + x * 4 + 0] = tex_colors16[y * width * 4 + x * 4 + 0]; @@ -1770,80 +1755,69 @@ static void prepare_texture_image(uint8_t *tex_colors, uint32_t width, uint32_t } } } + else if (tex_format == VK_FORMAT_R32G32B32A32_SFLOAT) { + uint32_t *data32 = (uint32_t *)data; + uint32_t *tex_colors32 = (uint32_t *)pixels; + for (uint32_t y = 0; y < height; y++) { + for (uint32_t x = 0; x < width; x++) { + data32[y * (layout.rowPitch / 4) + x * 4 + 0] = tex_colors32[y * width * 4 + x * 4 + 0]; + data32[y * (layout.rowPitch / 4) + x * 4 + 1] = tex_colors32[y * width * 4 + x * 4 + 1]; + data32[y * (layout.rowPitch / 4) + x * 4 + 2] = tex_colors32[y * width * 4 + x * 4 + 2]; + data32[y * (layout.rowPitch / 4) + x * 4 + 3] = tex_colors32[y * width * 4 + x * 4 + 3]; + } + } + } else if (tex_format == VK_FORMAT_B8G8R8A8_UNORM) { for (uint32_t y = 0; y < height; y++) { - // uint32_t *row = (uint32_t *)((char *)data + layout.rowPitch * y); for (uint32_t x = 0; x < width; x++) { - data[y * layout.rowPitch + x * 4 + 0] = tex_colors[y * width * 4 + x * 4 + 2]; - data[y * layout.rowPitch + x * 4 + 1] = tex_colors[y * width * 4 + x * 4 + 1]; - data[y * layout.rowPitch + x * 4 + 2] = tex_colors[y * width * 4 + x * 4 + 0]; - data[y * layout.rowPitch + x * 4 + 3] = tex_colors[y * width * 4 + x * 4 + 3]; - // row[x] = tex_colors[(x & 1) ^ (y & 1)]; + data[y * layout.rowPitch + x * 4 + 0] = pixels[y * width * 4 + x * 4 + 2]; + data[y * layout.rowPitch + x * 4 + 1] = pixels[y * width * 4 + x * 4 + 1]; + data[y * layout.rowPitch + x * 4 + 2] = pixels[y * width * 4 + x * 4 + 0]; + data[y * layout.rowPitch + x * 4 + 3] = pixels[y * width * 4 + x * 4 + 3]; } } } else { for (uint32_t y = 0; y < height; y++) { - // uint32_t *row = (uint32_t *)((char *)data + layout.rowPitch * y); for (uint32_t x = 0; x < width; x++) { - data[y * layout.rowPitch + x * 4 + 0] = tex_colors[y * width * 4 + x * 4 + 0]; - data[y * layout.rowPitch + x * 4 + 1] = tex_colors[y * width * 4 + x * 4 + 1]; - data[y * layout.rowPitch + x * 4 + 2] = tex_colors[y * width * 4 + x * 4 + 2]; - data[y * layout.rowPitch + x * 4 + 3] = tex_colors[y * width * 4 + x * 4 + 3]; - // row[x] = tex_colors[(x & 1) ^ (y & 1)]; + data[y * layout.rowPitch + x * 4 + 0] = pixels[y * width * 4 + x * 4 + 0]; + data[y * layout.rowPitch + x * 4 + 1] = pixels[y * width * 4 + x * 4 + 1]; + data[y * layout.rowPitch + x * 4 + 2] = pixels[y * width * 4 + x * 4 + 2]; + data[y * layout.rowPitch + x * 4 + 3] = pixels[y * width * 4 + x * 4 + 3]; } } } - vkUnmapMemory(device, tex_obj->mem); + vkUnmapMemory(device, impl->mem); } - if (usage & VK_IMAGE_USAGE_STORAGE_BIT) { - tex_obj->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - } - else { - tex_obj->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - } - - set_image_layout(tex_obj->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, tex_obj->imageLayout); -} - -static void update_stride(gpu_texture_t *texture) { - VkImageSubresource subres = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = 0, - .arrayLayer = 0, - }; - VkSubresourceLayout layout; - vkGetImageSubresourceLayout(device, texture->impl.image, &subres, &layout); - texture->impl.stride = (int)layout.rowPitch; + impl->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + set_image_layout(impl->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, impl->imageLayout); } void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, int height, gpu_texture_format_t format) { texture->width = width; texture->height = height; texture->format = format; - texture->data = data; - texture->impl.stage = 0; texture->state = GPU_TEXTURE_STATE_SHADER_RESOURCE; - const VkFormat tex_format = convert_image_format(format); + VkFormat tex_format = convert_image_format(format); VkFormatProperties props; vkGetPhysicalDeviceFormatProperties(gpu, tex_format, &props); if (props.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) { prepare_texture_image((uint8_t *)data, (uint32_t)width, (uint32_t)height, &texture->impl, VK_IMAGE_TILING_LINEAR, - VK_IMAGE_USAGE_SAMPLED_BIT /*| VK_IMAGE_USAGE_STORAGE_BIT*/, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &texture->impl.deviceSize, tex_format); + VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, tex_format); } else if (props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) { gpu_texture_impl_t staging_texture; memset(&staging_texture, 0, sizeof(staging_texture)); prepare_texture_image((uint8_t *)data, (uint32_t)width, (uint32_t)height, &staging_texture, VK_IMAGE_TILING_LINEAR, - VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &texture->impl.deviceSize, tex_format); + VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, tex_format); prepare_texture_image((uint8_t *)data, (uint32_t)width, (uint32_t)height, &texture->impl, VK_IMAGE_TILING_OPTIMAL, - (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT /*| VK_IMAGE_USAGE_STORAGE_BIT*/), - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &texture->impl.deviceSize, tex_format); + (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT), + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tex_format); set_image_layout(staging_texture.image, VK_IMAGE_ASPECT_COLOR_BIT, staging_texture.imageLayout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); set_image_layout(texture->impl.image, VK_IMAGE_ASPECT_COLOR_BIT, texture->impl.imageLayout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); @@ -1874,7 +1848,13 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, vkFreeMemory(device, staging_texture.mem, NULL); } - update_stride(texture); + VkImageSubresource subres = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .mipLevel = 0, + .arrayLayer = 0, + }; + VkSubresourceLayout layout; + vkGetImageSubresourceLayout(device, texture->impl.image, &subres, &layout); VkImageViewCreateInfo view = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, @@ -1908,69 +1888,6 @@ void gpu_texture_destroy(gpu_texture_t *target) { } } -void gpu_texture_set_mipmap(gpu_texture_t *texture, gpu_texture_t *mipmap, int level) { - // VkBuffer staging_buffer; - // VkDeviceMemory staging_buffer_mem; - - // VkBufferCreateInfo buffer_info = { - // .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - // .size = mipmap->width * mipmap->height * format_size(mipmap->format), - // .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - // .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - // }; - - // vkCreateBuffer(device, &buffer_info, NULL, &staging_buffer); - - // VkMemoryRequirements mem_req; - // vkGetBufferMemoryRequirements(device, staging_buffer, &mem_req); - - // VkMemoryAllocateInfo alloc_info = { - // .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - // .allocationSize = mem_req.size, - // }; - - // memory_type_from_properties(mem_req.memoryTypeBits, - // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &alloc_info.memoryTypeIndex); - - // vkAllocateMemory(device, &alloc_info, NULL, &staging_buffer_mem); - // vkBindBufferMemory(device, staging_buffer, staging_buffer_mem, 0); - - // void *mapped_data; - // vkMapMemory(device, staging_buffer_mem, 0, buffer_info.size, 0, &mapped_data); - // memcpy(mapped_data, mipmap->data, (size_t)buffer_info.size); - // vkUnmapMemory(device, staging_buffer_mem); - - // set_image_layout(texture->impl.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - - // VkBufferImageCopy region = { - // .bufferOffset = 0, - // .bufferRowLength = 0, - // .bufferImageHeight = 0, - // .imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - // .imageSubresource.mipLevel = level, - // .imageSubresource.baseArrayLayer = 0, - // .imageSubresource.layerCount = 1, - // .imageOffset = (VkOffset3D){0, 0, 0}, - // .imageExtent = (VkExtent3D){(uint32_t)mipmap->width, (uint32_t)mipmap->height, 1}, - // }; - - // vkCmdCopyBufferToImage( - // command_buffer, - // staging_buffer, - // texture->impl.image, - // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - // 1, - // ®ion - // ); - - // set_image_layout(texture->impl.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - // VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - - // vkFreeMemory(device, staging_buffer_mem, NULL); - // vkDestroyBuffer(device, staging_buffer, NULL); -} - void gpu_render_target_init(gpu_texture_t *target, int width, int height, gpu_texture_format_t format) { gpu_render_target_init2(target, width, height, format, -1); } diff --git a/base/sources/backends/vulkan_gpu.h b/base/sources/backends/vulkan_gpu.h index a45eba63..df211506 100644 --- a/base/sources/backends/vulkan_gpu.h +++ b/base/sources/backends/vulkan_gpu.h @@ -24,8 +24,6 @@ typedef struct { typedef struct { VkImageLayout imageLayout; - VkDeviceSize deviceSize; - int stride; VkImage image; VkDeviceMemory mem; VkImageView view; @@ -33,7 +31,6 @@ typedef struct { VkBuffer readback_buffer; VkDeviceMemory readback_memory; bool readback_buffer_created; - int stage; } gpu_texture_impl_t; typedef struct { diff --git a/base/sources/backends/webgpu_gpu.c b/base/sources/backends/webgpu_gpu.c index 254d955c..775c3e7e 100644 --- a/base/sources/backends/webgpu_gpu.c +++ b/base/sources/backends/webgpu_gpu.c @@ -161,7 +161,6 @@ int gpu_index_buffer_count(gpu_buffer_t *buffer) { void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, int height, gpu_texture_format_t format) {} void gpu_texture_destroy(gpu_texture_t *texture) {} -void gpu_texture_set_mipmap(gpu_texture_t *texture, gpu_texture_t *mipmap, int level) {} void gpu_render_target_init(gpu_texture_t *target, int width, int height, gpu_texture_format_t format) { target->width = target->width = width; diff --git a/base/sources/iron.h b/base/sources/iron.h index b2f18064..733014e3 100644 --- a/base/sources/iron.h +++ b/base/sources/iron.h @@ -1350,38 +1350,26 @@ buffer_t *gpu_get_texture_pixels(gpu_texture_t *image) { } image->buffer->length = _format_byte_size(image->format) * image->width * image->height; - if (image->data == NULL) { - if (image->buffer->buffer == NULL) { - image->buffer->buffer = malloc(image->buffer->length); - } - - uint8_t *b = (uint8_t *)image->buffer->buffer; - gpu_get_render_target_pixels(image, b); - - // Release staging texture immediately to save memory - #ifdef IRON_DIRECT3D12 - image->impl.readback->lpVtbl->Release(image->impl.readback); - image->impl.readback = NULL; - #elif defined(IRON_METAL) - // id texReadback = (__bridge_transfer id)image->impl._texReadback; - // texReadback = nil; - // image->impl._texReadback = NULL; - #endif - } - else { - image->buffer->buffer = image->data; + if (image->buffer->buffer == NULL) { + image->buffer->buffer = malloc(image->buffer->length); } + + uint8_t *b = (uint8_t *)image->buffer->buffer; + gpu_get_render_target_pixels(image, b); + + // Release staging texture immediately to save memory + #ifdef IRON_DIRECT3D12 + image->impl.readback->lpVtbl->Release(image->impl.readback); + image->impl.readback = NULL; + #elif defined(IRON_METAL) + // id texReadback = (__bridge_transfer id)image->impl._texReadback; + // texReadback = nil; + // image->impl._texReadback = NULL; + #endif + return image->buffer; } -void gpu_set_mipmaps(gpu_texture_t *texture, any_array_t *mipmaps) { - for (int32_t i = 0; i < mipmaps->length; ++i) { - gpu_texture_t *img = mipmaps->buffer[i]; - gpu_texture_t *img_tex = img; - gpu_texture_set_mipmap(texture, img_tex, i + 1); - } -} - void _gpu_begin(gpu_texture_t *render_target, any_array_t *additional, gpu_texture_t *depth_buffer, unsigned flags, unsigned color, float depth) { if (render_target == NULL) { gpu_begin(NULL, 0, NULL, flags, color, depth); diff --git a/base/sources/iron_gpu.h b/base/sources/iron_gpu.h index e12b598f..f16d7a67 100644 --- a/base/sources/iron_gpu.h +++ b/base/sources/iron_gpu.h @@ -82,7 +82,6 @@ typedef struct gpu_texture { int height; gpu_texture_format_t format; gpu_texture_compression_t compression; - void *data; gpu_texture_state_t state; buffer_t *buffer; gpu_texture_impl_t impl; @@ -173,7 +172,6 @@ void gpu_set_matrix4(int location, iron_matrix4x4_t value); void gpu_vertex_structure_add(gpu_vertex_structure_t *structure, const char *name, gpu_vertex_data_t data); void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, int height, gpu_texture_format_t format); void gpu_texture_destroy(gpu_texture_t *texture); -void gpu_texture_set_mipmap(gpu_texture_t *texture, gpu_texture_t *mipmap, int level); void gpu_render_target_init(gpu_texture_t *target, int width, int height, gpu_texture_format_t format); void gpu_render_target_init2(gpu_texture_t *render_target, int width, int height, gpu_texture_format_t format, int framebuffer_index); void gpu_vertex_buffer_init(gpu_buffer_t *buffer, int count, gpu_vertex_structure_t *structure); diff --git a/base/sources/iron_system.c b/base/sources/iron_system.c index ea21196b..07770211 100644 --- a/base/sources/iron_system.c +++ b/base/sources/iron_system.c @@ -274,8 +274,6 @@ void iron_start(void) { #endif } -void iron_memory_emergency(void) {} - static uint8_t *current_file = NULL; static size_t current_file_size = 0; diff --git a/base/sources/ts/import_envmap.ts b/base/sources/ts/import_envmap.ts index 881a3c81..9f36b89c 100644 --- a/base/sources/ts/import_envmap.ts +++ b/base/sources/ts/import_envmap.ts @@ -67,7 +67,6 @@ function import_envmap_run(path: string, image: gpu_texture_t) { import_envmap_get_radiance_mip(import_envmap_mips[i], i, import_envmap_radiance); array_push(import_envmap_mips_cpu, gpu_create_texture_from_bytes(gpu_get_texture_pixels(import_envmap_mips[i]), import_envmap_mips[i].width, import_envmap_mips[i].height, tex_format_t.RGBA128)); } - gpu_set_mipmaps(import_envmap_radiance_cpu, import_envmap_mips_cpu); // Irradiance scene_world._.irradiance = import_envmap_get_spherical_harmonics(radiance_pixels, import_envmap_radiance.width, import_envmap_radiance.height); diff --git a/base/sources/ts/iron/iron.ts b/base/sources/ts/iron/iron.ts index f61cf9b9..7981e327 100644 --- a/base/sources/ts/iron/iron.ts +++ b/base/sources/ts/iron/iron.ts @@ -274,7 +274,6 @@ declare function gpu_create_render_target(width: i32, height: i32, format: i32 = declare function gpu_create_texture_from_bytes(data: buffer_t, width: i32, height: i32, format: i32 = tex_format_t.RGBA32): any; declare function gpu_create_texture_from_encoded_bytes(data: buffer_t, format: string): any; declare function gpu_get_texture_pixels(texture: any): buffer_t; -declare function gpu_set_mipmaps(texture: any, mipmaps: gpu_texture_t[]): void; declare function gpu_viewport(x: i32, y: i32, width: i32, height: i32): void; declare function gpu_scissor(x: i32, y: i32, width: i32, height: i32): void; declare function gpu_disable_scissor(): void; @@ -770,6 +769,7 @@ declare type gpu_texture_t = { width: i32; height: i32; }; + declare type ui_theme_t = any; declare type ui_t = { diff --git a/base/sources/ts/iron/material_data.ts b/base/sources/ts/iron/material_data.ts index de574885..1c5a03f9 100644 --- a/base/sources/ts/iron/material_data.ts +++ b/base/sources/ts/iron/material_data.ts @@ -81,29 +81,6 @@ function material_context_create(raw: material_context_t): material_context_t { let image: gpu_texture_t = data_get_image(tex.file); array_push(raw._.textures, image); - - // Set mipmaps - if (tex.mipmaps != null) { - let mipmaps: gpu_texture_t[] = []; - while (mipmaps.length < tex.mipmaps.length) { - array_push(mipmaps, null); - } - - for (let j: i32 = 0; j < tex.mipmaps.length; ++j) { - let name: string = tex.mipmaps[j]; - let mipimg: gpu_texture_t = data_get_image(name); - mipmaps[j] = mipimg; - } - - gpu_set_mipmaps(image, mipmaps); - tex.mipmaps = null; - tex.generate_mipmaps = false; - } - else if (tex.generate_mipmaps == true && image != null) { - // gpu_texture_generate_mipmaps(image, 1000); - tex.mipmaps = null; - tex.generate_mipmaps = false; - } } } diff --git a/base/sources/ts/iron/render_path.ts b/base/sources/ts/iron/render_path.ts index 83221d40..1f6b6c46 100644 --- a/base/sources/ts/iron/render_path.ts +++ b/base/sources/ts/iron/render_path.ts @@ -6,7 +6,6 @@ type render_target_t = { // Opt format?: string; scale?: f32; - mipmaps?: bool; // Runtime _image?: gpu_texture_t; }; @@ -322,7 +321,6 @@ function render_path_get_tex_format(s: string): tex_format_t { function render_target_create(): render_target_t { let raw: render_target_t = {}; raw.scale = 1.0; - raw.mipmaps = false; return raw; } diff --git a/base/sources/ts/iron/scene.ts b/base/sources/ts/iron/scene.ts index e89e549c..8a56638e 100644 --- a/base/sources/ts/iron/scene.ts +++ b/base/sources/ts/iron/scene.ts @@ -553,8 +553,6 @@ type bind_const_t = { type bind_tex_t = { name?: string; file?: string; - generate_mipmaps?: bool; - mipmaps?: string[]; // Reference image names }; type shader_data_t = { diff --git a/base/sources/ts/iron/world_data.ts b/base/sources/ts/iron/world_data.ts index d7df2f53..fa8f2e3f 100644 --- a/base/sources/ts/iron/world_data.ts +++ b/base/sources/ts/iron/world_data.ts @@ -28,7 +28,6 @@ function world_data_parse(name: string, id: string): world_data_t { let mipimg: gpu_texture_t = data_get_image(base + "_" + i + ext); raw._.radiance_mipmaps[i] = mipimg; } - gpu_set_mipmaps(raw._.radiance, raw._.radiance_mipmaps); } return raw; diff --git a/base/sources/ts/parser_material.ts b/base/sources/ts/parser_material.ts index 6829a5a9..c99587af 100644 --- a/base/sources/ts/parser_material.ts +++ b/base/sources/ts/parser_material.ts @@ -2011,9 +2011,6 @@ function parser_material_make_bind_tex(tex_name: string, file: string): bind_tex name: tex_name, file: file }; - if (context_raw.texture_filter) { - tex.generate_mipmaps = true; - } return tex; } diff --git a/base/sources/ts/util_clone.ts b/base/sources/ts/util_clone.ts index e88a3b8a..f6bdb23c 100644 --- a/base/sources/ts/util_clone.ts +++ b/base/sources/ts/util_clone.ts @@ -255,8 +255,6 @@ function util_clone_bind_textures(texs: bind_tex_t[]): bind_tex_t[] { let t: bind_tex_t = {}; t.name = texs[i].name; t.file = texs[i].file; - t.generate_mipmaps = texs[i].generate_mipmaps; - t.mipmaps = util_clone_string_array(texs[i].mipmaps); array_push(r, t); } return r;