Commit 62e76f5
authored
feat(🤖): correct per-buffer YUV conversion for Android camera frames (#387)
Three improvements to the Android camera-frame path, found while reviewing
the VisionCamera integration:
1. Expose GPUExternalTexture.yuvToRgbMatrix (non-spec extension).
Dawn samples Android external-format (opaque YCbCr) buffers through a
Vulkan conversion hard-coded to RGB_IDENTITY (SamplerVk.cpp, see
crbug.com/497675620), so shaders receive raw [Y, Cb, Cr] and previously
had to guess the conversion. The example hard-coded BT.709 narrow-range,
but Android camera streams are usually BT.601, and range varies by
device, which skews colors. The driver reports the correct model and
range per buffer (suggestedYcbcrModel/Range); Dawn captures them at
import time and we now read them back via the shared memory's
AHardwareBuffer properties and derive the exact 3x4 conversion matrix.
On iOS and for RGBA surfaces the matrix is the identity passthrough, so
shaders can apply it unconditionally. The VisionCamera example now
uploads the matrix as uniforms instead of hard-coding coefficients.
2. Fail fast on CPU-only AHardwareBuffers.
Dawn only grants TextureBinding when the AHB was allocated with
AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE; without it, import fails deep
inside Dawn with an opaque validation error. wrapNativeBuffer now checks
the usage bits and throws an actionable error (pointing at
vision-camera's pixelFormat: 'native').
3. Remove the unreachable "defined biplanar format" branch on Android.
Dawn maps every YUV AHB format (Y8Cb8Cr8_420, P010, vendor formats) to
OpaqueYCbCrAndroid (AHBFunctions.cpp), so the R8BG8Biplanar420Unorm
plane-splitting path and its BT.709 matrix could never run.
Also folds the Android both-axes flip in the example into the rotation
passed to importExternalTexture (a double mirror is a 180° rotation),
removing the per-fragment flip branches from the WGSL prelude.1 parent cb845d4 commit 62e76f5
7 files changed
Lines changed: 235 additions & 152 deletions
File tree
- apps/example/src/VisionCamera
- packages/webgpu
- android/cpp
- cpp/rnwgpu/api
- src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
| 170 | + | |
| 171 | + | |
170 | 172 | | |
171 | 173 | | |
172 | 174 | | |
| |||
254 | 256 | | |
255 | 257 | | |
256 | 258 | | |
257 | | - | |
| 259 | + | |
| 260 | + | |
258 | 261 | | |
259 | 262 | | |
260 | 263 | | |
| |||
282 | 285 | | |
283 | 286 | | |
284 | 287 | | |
285 | | - | |
| 288 | + | |
| 289 | + | |
286 | 290 | | |
287 | 291 | | |
288 | 292 | | |
| |||
469 | 473 | | |
470 | 474 | | |
471 | 475 | | |
472 | | - | |
473 | | - | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
474 | 481 | | |
475 | 482 | | |
476 | 483 | | |
| |||
479 | 486 | | |
480 | 487 | | |
481 | 488 | | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
482 | 492 | | |
483 | 493 | | |
484 | 494 | | |
| |||
496 | 506 | | |
497 | 507 | | |
498 | 508 | | |
499 | | - | |
500 | | - | |
501 | | - | |
502 | | - | |
503 | | - | |
504 | | - | |
505 | | - | |
506 | | - | |
507 | | - | |
508 | | - | |
509 | | - | |
510 | | - | |
511 | | - | |
512 | | - | |
513 | | - | |
514 | 509 | | |
515 | 510 | | |
516 | 511 | | |
| |||
525 | 520 | | |
526 | 521 | | |
527 | 522 | | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
528 | 546 | | |
529 | 547 | | |
530 | 548 | | |
| |||
542 | 560 | | |
543 | 561 | | |
544 | 562 | | |
545 | | - | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
546 | 570 | | |
547 | 571 | | |
548 | 572 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
24 | 28 | | |
25 | 29 | | |
26 | 30 | | |
| |||
63 | 67 | | |
64 | 68 | | |
65 | 69 | | |
66 | | - | |
67 | | - | |
68 | | - | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
69 | 73 | | |
70 | 74 | | |
71 | 75 | | |
72 | | - | |
73 | | - | |
| 76 | + | |
| 77 | + | |
74 | 78 | | |
75 | 79 | | |
76 | 80 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
3 | 1 | | |
4 | 2 | | |
5 | 3 | | |
6 | | - | |
7 | | - | |
| 4 | + | |
| 5 | + | |
8 | 6 | | |
9 | 7 | | |
10 | 8 | | |
| |||
22 | 20 | | |
23 | 21 | | |
24 | 22 | | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
25 | 27 | | |
26 | 28 | | |
27 | 29 | | |
| |||
56 | 58 | | |
57 | 59 | | |
58 | 60 | | |
59 | | - | |
| 61 | + | |
| 62 | + | |
60 | 63 | | |
61 | 64 | | |
62 | 65 | | |
| |||
177 | 180 | | |
178 | 181 | | |
179 | 182 | | |
180 | | - | |
181 | | - | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
188 | 192 | | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
199 | | - | |
200 | | - | |
201 | | - | |
202 | | - | |
203 | | - | |
204 | | - | |
205 | | - | |
206 | | - | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
218 | 199 | | |
219 | 200 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
241 | 241 | | |
242 | 242 | | |
243 | 243 | | |
244 | | - | |
245 | | - | |
| 244 | + | |
| 245 | + | |
246 | 246 | | |
247 | 247 | | |
248 | 248 | | |
| |||
302 | 302 | | |
303 | 303 | | |
304 | 304 | | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
305 | 320 | | |
306 | 321 | | |
307 | 322 | | |
| |||
312 | 327 | | |
313 | 328 | | |
314 | 329 | | |
315 | | - | |
316 | | - | |
317 | | - | |
318 | | - | |
319 | | - | |
320 | | - | |
321 | | - | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
322 | 337 | | |
323 | 338 | | |
324 | 339 | | |
| |||
0 commit comments