]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/texture_backend.cpp
Convert RGB pixel data to RGBA when staging
[libs/gl.git] / source / backends / vulkan / texture_backend.cpp
index 168d6adb0501d69a501b83e8bb726a860fd8e978..dd19c63664b88658fe06917798742bbcbb4fd2f5 100644 (file)
@@ -100,6 +100,43 @@ void VulkanTexture::allocate()
                set_vulkan_object_names();
 }
 
+void VulkanTexture::stage_pixels(void *staging, const void *data, size_t count)
+{
+       const Texture &self = *static_cast<const Texture *>(this);
+
+       if(self.swizzle==RGBA_TO_RGB)
+       {
+               const uint32_t *src = static_cast<const uint32_t *>(data);
+               uint32_t *dst = static_cast<uint32_t *>(staging);
+               size_t i = 0;
+               for(; i+3<count; i+=4)
+               {
+                       dst[0] = src[0]|0xFF000000;
+                       dst[1] = (src[0]>>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<count)
+               {
+                       const uint8_t *src_bytes = reinterpret_cast<const uint8_t *>(src);
+                       for(; i<count; ++i)
+                       {
+                               *dst++ = src_bytes[0]|(src_bytes[1]<<8)|(src_bytes[2]<<16)|0xFF000000;
+                               src_bytes += 3;
+                       }
+               }
+       }
+       else
+       {
+               const char *src = static_cast<const char *>(data);
+               size_t data_size = count*get_pixel_size(self.storage_fmt);
+               copy(src, src+data_size, static_cast<char *>(staging));
+       }
+}
+
 void VulkanTexture::generate_mipmap_levels(unsigned n_levels)
 {
        TransferQueue &tq = device.get_transfer_queue();