[YUV AHB] Add a ColorSpaceDawn structure for input YUV color space.

This will be useful to marshall data between Kotlin and Dawn for the
color space conversion of imported YUV AHBs.

The source color space is very flexible because it can represent any
variety of data produced. In particular it contains YCbCr range and
matrices, and decouples the transfer function from the primaries.

Destination color spaces are less flexible and must use one of the
PredefineColorSpaces (to which linear variants are added).

Also update the Kotlin build file and tests.

Finally allow enum value conflicts with "is_proxy" as the transfer
function for sRGB and Rec709 are the same (by design) but we want
developers to be able to use either of the names.

Bug: 468988322
Change-Id: I7bb46a4918af4f874fa84a0e808b70514b2d863b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/300216
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Tarun Saini <sainitarun@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/generator/dawn_json_generator.py b/generator/dawn_json_generator.py
index 08f8929..8ced925 100644
--- a/generator/dawn_json_generator.py
+++ b/generator/dawn_json_generator.py
@@ -198,7 +198,6 @@
         all_values = set()
         for value in self.values:
             if value.value in all_values:
-                #TODO(42241174) remove this condition once wgpu refactoring is complete.
                 if not value.json_data.get('enum_value_conflict', False):
                     raise Exception(
                         "Duplicate value {} for '{}' in enum '{}'".format(
@@ -1445,8 +1444,10 @@
 
 
 def is_enum_value_proxy(value):
-    return ('deprecated' in value.json_data.get('tags', [])
-            and value.json_data.get('enum_value_conflict', False))
+    conflicts = value.json_data.get('enum_value_conflict', False)
+    is_proxy = 'deprecated' in value.json_data.get(
+        'tags', []) or value.json_data.get('is_proxy', False)
+    return conflicts and is_proxy
 
 
 def unreachable_code(msg="unreachable_code"):
diff --git a/src/dawn/dawn.json b/src/dawn/dawn.json
index 2cb19ba..9033bca 100644
--- a/src/dawn/dawn.json
+++ b/src/dawn/dawn.json
@@ -1835,6 +1835,54 @@
             {"name": "rotation", "type": "external texture rotation", "default": "rotate 0 degrees"}
         ]
     },
+    "color space primaries dawn": {
+        "category": "enum",
+        "tags": ["dawn", "art"],
+        "values": [
+            {"value": 1, "name": "sRGB", "enum_value_conflict": true},
+            {"value": 1, "name": "rec 709", "enum_value_conflict": true, "is_proxy": true, "_comment": "sRGB and Rec709 have the same primaries"},
+            {"value": 2, "name": "rec 601"},
+            {"value": 3, "name": "rec 2020"},
+            {"value": 4, "name": "display p3"}
+        ]
+    },
+    "color space transfer dawn": {
+        "category": "enum",
+        "tags": ["dawn", "art"],
+        "values": [
+            {"value": 1, "name": "sRGB"},
+            {"value": 2, "name": "display p3"}
+        ]
+    },
+    "color space y cb cr range dawn": {
+        "category": "enum",
+        "tags": ["dawn", "art"],
+        "values": [
+            {"value": 1, "name": "narrow"},
+            {"value": 2, "name": "full"}
+        ]
+    },
+    "color space y cb cr matrix dawn": {
+        "category": "enum",
+        "tags": ["dawn", "art"],
+        "values": [
+            {"value": 1, "name": "identity"},
+            {"value": 2, "name": "rec 601"},
+            {"value": 3, "name": "rec 709"},
+            {"value": 4, "name": "rec 2020"}
+        ]
+    },
+    "color space dawn" : {
+        "category": "structure",
+        "extensible": "in",
+        "tags": ["dawn", "art"],
+        "members": [
+            {"name": "primaries", "type": "color space primaries dawn"},
+            {"name": "transfer", "type": "color space transfer dawn"},
+            {"name": "y cb cr range", "type": "color space y cb cr range dawn"},
+            {"name": "y cb cr matrix", "type": "color space y cb cr matrix dawn"}
+        ]
+    },
     "status": {
         "category": "enum",
         "values": [
@@ -3945,7 +3993,9 @@
         "category": "enum",
         "values": [
             {"value": 1, "name": "sRGB"},
-            {"value": 2, "name": "display p3"}
+            {"value": 2, "name": "display p3"},
+            {"value": 3, "name": "sRGB linear", "tags": ["dawn", "art"]},
+            {"value": 4, "name": "display p3 linear", "tags": ["dawn", "art"]}
         ]
     },
     "tone mapping mode": {
diff --git a/tools/android/BUILD.gn b/tools/android/BUILD.gn
index 007db4d..d054d62 100644
--- a/tools/android/BUILD.gn
+++ b/tools/android/BUILD.gn
@@ -52,6 +52,10 @@
     "java/androidx/webgpu/BufferMapState.kt",
     "java/androidx/webgpu/BufferUsage.kt",
     "java/androidx/webgpu/CallbackMode.kt",
+    "java/androidx/webgpu/ColorSpacePrimariesDawn.kt",
+    "java/androidx/webgpu/ColorSpaceTransferDawn.kt",
+    "java/androidx/webgpu/ColorSpaceYCbCrMatrixDawn.kt",
+    "java/androidx/webgpu/ColorSpaceYCbCrRangeDawn.kt",
     "java/androidx/webgpu/ColorWriteMask.kt",
     "java/androidx/webgpu/CompareFunction.kt",
     "java/androidx/webgpu/CompilationInfoRequestStatus.kt",
@@ -83,9 +87,9 @@
     "java/androidx/webgpu/GPUBlendState.kt",
     "java/androidx/webgpu/GPUBuffer.kt",
     "java/androidx/webgpu/GPUBufferBindingLayout.kt",
-    "java/androidx/webgpu/GPUTextureBindingViewDimension.kt",
     "java/androidx/webgpu/GPUBufferDescriptor.kt",
     "java/androidx/webgpu/GPUColor.kt",
+    "java/androidx/webgpu/GPUColorSpaceDawn.kt",
     "java/androidx/webgpu/GPUColorTargetState.kt",
     "java/androidx/webgpu/GPUCommandBuffer.kt",
     "java/androidx/webgpu/GPUCommandBufferDescriptor.kt",
@@ -160,6 +164,7 @@
     "java/androidx/webgpu/GPUTexelCopyTextureInfo.kt",
     "java/androidx/webgpu/GPUTexture.kt",
     "java/androidx/webgpu/GPUTextureBindingLayout.kt",
+    "java/androidx/webgpu/GPUTextureBindingViewDimension.kt",
     "java/androidx/webgpu/GPUTextureComponentSwizzle.kt",
     "java/androidx/webgpu/GPUTextureComponentSwizzleDescriptor.kt",
     "java/androidx/webgpu/GPUTextureDescriptor.kt",
diff --git a/tools/android/webgpu/src/test/java/androidx/webgpu/MappedNamedConstantsTest.kt b/tools/android/webgpu/src/test/java/androidx/webgpu/MappedNamedConstantsTest.kt
index 8b2b72e..809cbc3 100644
--- a/tools/android/webgpu/src/test/java/androidx/webgpu/MappedNamedConstantsTest.kt
+++ b/tools/android/webgpu/src/test/java/androidx/webgpu/MappedNamedConstantsTest.kt
@@ -46,6 +46,10 @@
         BufferMapState::class,
         BufferUsage::class,
         CallbackMode::class,
+        ColorSpacePrimariesDawn::class,
+        ColorSpaceTransferDawn::class,
+        ColorSpaceYCbCrRangeDawn::class,
+        ColorSpaceYCbCrMatrixDawn::class,
         ColorWriteMask::class,
         CompareFunction::class,
         CompilationInfoRequestStatus::class,