@@ -5,6 +5,7 @@ use super::{
55 gpu_command_encoder:: CanvasImageCopyTexture ,
66 structs:: { CanvasExtent3d , CanvasImageCopyExternalImage , CanvasImageDataLayout } ,
77} ;
8+ use crate :: webgpu:: enums:: CanvasGPUTextureFormat ;
89//use wgpu_core::gfx_select;
910use crate :: webgpu:: error:: { handle_error, handle_error_fatal} ;
1011use crate :: webgpu:: prelude:: label_to_ptr;
@@ -144,6 +145,17 @@ pub unsafe extern "C" fn canvas_native_webgpu_queue_copy_webgl_to_texture(
144145 ) ;
145146 }
146147
148+ {
149+ let destination = & * destination;
150+ let texture = & * destination. texture ;
151+ match texture. format {
152+ CanvasGPUTextureFormat :: Bgra8Unorm | CanvasGPUTextureFormat :: Bgra8UnormSrgb => {
153+ canvas_core:: image_asset:: ImageAsset :: rgba_to_bgra_in_place ( bytes. as_mut_slice ( ) )
154+ }
155+ _ => { }
156+ }
157+ }
158+
147159
148160 let ext_source = CanvasImageCopyExternalImage {
149161 source : bytes. as_ptr ( ) ,
@@ -179,9 +191,6 @@ pub unsafe extern "C" fn canvas_native_webgpu_queue_copy_context_to_texture(
179191
180192 let ( width, height) = context. context . dimensions ( ) ;
181193
182- let mut data = vec ! [ 0u8 ; ( width * height * 4. ) as usize ] ;
183-
184- context. context . get_pixels ( data. as_mut_slice ( ) , ( 0 , 0 ) , ( width as i32 , height as i32 ) ) ;
185194
186195 let queue = & * queue;
187196 let queue_id = queue. queue . id ;
@@ -190,6 +199,17 @@ pub unsafe extern "C" fn canvas_native_webgpu_queue_copy_context_to_texture(
190199
191200 let destination_texture = & * destination. texture ;
192201
202+ let mut data = vec ! [ 0u8 ; ( width * height * 4. ) as usize ] ;
203+
204+ match destination_texture. format {
205+ CanvasGPUTextureFormat :: Bgra8Unorm | CanvasGPUTextureFormat :: Bgra8UnormSrgb => {
206+ context. context . get_pixels_format ( data. as_mut_slice ( ) , ( 0 , 0 ) , ( width as i32 , height as i32 ) , canvas_2d:: context:: ColorType :: BGRA8888 ) ;
207+ }
208+ _ => {
209+ context. context . get_pixels ( data. as_mut_slice ( ) , ( 0 , 0 ) , ( width as i32 , height as i32 ) ) ;
210+ }
211+ }
212+
193213 let destination_texture_id = destination_texture. texture ;
194214
195215 let size = * size;
@@ -265,7 +285,7 @@ pub unsafe extern "C" fn canvas_native_webgpu_queue_copy_image_asset_to_texture(
265285 }
266286 let image_asset = & * source. source ;
267287 image_asset. with_bytes_dimension ( |bytes, dimension| {
268- let ext_source = CanvasImageCopyExternalImage {
288+ let mut ext_source = CanvasImageCopyExternalImage {
269289 source : bytes. as_ptr ( ) ,
270290 source_size : bytes. len ( ) ,
271291 origin : source. origin ,
@@ -274,7 +294,23 @@ pub unsafe extern "C" fn canvas_native_webgpu_queue_copy_image_asset_to_texture(
274294 height : dimension. 1 ,
275295 } ;
276296
277- canvas_native_webgpu_queue_copy_external_image_to_texture ( queue, & ext_source, destination, size) ;
297+ {
298+ let destination = & * destination;
299+ let texture = & * destination. texture ;
300+ match texture. format {
301+ CanvasGPUTextureFormat :: Bgra8Unorm | CanvasGPUTextureFormat :: Bgra8UnormSrgb => {
302+ let mut bytes = bytes. to_vec ( ) ;
303+ canvas_core:: image_asset:: ImageAsset :: rgba_to_bgra_in_place ( bytes. as_mut_slice ( ) ) ;
304+
305+ ext_source. source = bytes. as_ptr ( ) ;
306+
307+ canvas_native_webgpu_queue_copy_external_image_to_texture ( queue, & ext_source, destination, size) ;
308+ }
309+ _ => {
310+ canvas_native_webgpu_queue_copy_external_image_to_texture ( queue, & ext_source, destination, size) ;
311+ }
312+ }
313+ }
278314 } ) ;
279315}
280316
0 commit comments