X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fbackends%2Fvulkan%2Ftexture_backend.cpp;h=ec6d504732f9f0a13055eff1f42086d2fe4858a7;hb=7b59f9eb7120bf31afded9105aba8163a4381e5b;hp=168d6adb0501d69a501b83e8bb726a860fd8e978;hpb=d2a23243b7f25e56ef098196b2962c103989143f;p=libs%2Fgl.git diff --git a/source/backends/vulkan/texture_backend.cpp b/source/backends/vulkan/texture_backend.cpp index 168d6adb..ec6d5047 100644 --- a/source/backends/vulkan/texture_backend.cpp +++ b/source/backends/vulkan/texture_backend.cpp @@ -49,7 +49,7 @@ void VulkanTexture::allocate() image_info.extent.width = 1; image_info.extent.height = 1; image_info.extent.depth = 1; - image_info.mipLevels = 1; + image_info.mipLevels = self.n_levels; image_info.arrayLayers = 1; image_info.samples = VK_SAMPLE_COUNT_1_BIT; image_info.tiling = VK_IMAGE_TILING_OPTIMAL; @@ -73,7 +73,7 @@ void VulkanTexture::allocate() memory_id = device.get_allocator().allocate(handle, DEVICE_MEMORY); // Trigger a layout transition if the image is used before uploading data. - change_layout(0, -1, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); + change_layout(-1, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); } VkImageViewCreateInfo view_info = { }; @@ -100,15 +100,54 @@ void VulkanTexture::allocate() set_vulkan_object_names(); } -void VulkanTexture::generate_mipmap_levels(unsigned n_levels) +void VulkanTexture::stage_pixels(void *staging, const void *data, size_t count) { + const Texture &self = *static_cast(this); + + if(self.swizzle==RGBA_TO_RGB) + { + const uint32_t *src = static_cast(data); + uint32_t *dst = static_cast(staging); + size_t i = 0; + for(; i+3>24)|(src[1]<<8)|0xFF000000; + dst[2] = (src[1]>>16)|(src[2]<<16)|0xFF000000; + dst[3] = (src[2]>>8)|0xFF000000; + src += 3; + dst += 4; + } + + if(i(src); + for(; i(data); + size_t data_size = count*get_pixel_size(self.storage_fmt); + copy(src, src+data_size, static_cast(staging)); + } +} + +void VulkanTexture::generate_mipmap() +{ + unsigned n_levels = static_cast(this)->n_levels; + TransferQueue &tq = device.get_transfer_queue(); for(unsigned i=0; i+1(this)->storage_fmt)); - if(n_levels>0) - device.get_synchronizer().split_image_mipmap(handle, aspect, n_levels); + const Texture &self = *static_cast(this); + + unsigned aspect = get_vulkan_aspect(get_components(self.storage_fmt)); + if(level>=0) + device.get_synchronizer().split_image_mipmap(handle, aspect, self.n_levels); device.get_synchronizer().change_image_layout(handle, aspect, level, layout, discard); }