diff --git a/src/gpu/graphite/dawn/DawnGraphiteUtils.cpp b/src/gpu/graphite/dawn/DawnGraphiteUtils.cpp index 5bf6e7a769..1ec70908ee 100644 --- a/src/gpu/graphite/dawn/DawnGraphiteUtils.cpp +++ b/src/gpu/graphite/dawn/DawnGraphiteUtils.cpp @@ -312,19 +312,27 @@ ImmutableSamplerInfo DawnDescriptorToImmutableSamplerInfo(const wgpu::YCbCrVkDes const bool usesExternalFormat = DawnDescriptorUsesExternalFormat(desc); + // Mask each field to its allotted bit-width before shifting. The SkASSERTs + // above are debug-only; in release, hostile renderer-supplied values + // (e.g. vkYCbCrModel=0xFF via TransferableResource.ycbcr_info) would + // overflow into adjacent fields and produce an invalid wgpu::FilterMode + // on round-trip, reaching DAWN_UNREACHABLE in ToVulkanSamplerFilter. + #define SKGPU_PACK_FIELD(val, bits, shift) \ + (((uint32_t)(val) & ((1u << (bits)) - 1u)) << (shift)) ImmutableSamplerInfo info; info.fNonFormatYcbcrConversionInfo = - (((uint32_t)(usesExternalFormat ) << kUsesExternalFormatShift) | - ((uint32_t)(desc.vkYCbCrModel ) << kYcbcrModelShift ) | - ((uint32_t)(desc.vkYCbCrRange ) << kYcbcrRangeShift ) | - ((uint32_t)(desc.vkXChromaOffset ) << kXChromaOffsetShift ) | - ((uint32_t)(desc.vkYChromaOffset ) << kYChromaOffsetShift ) | - ((uint32_t)(desc.vkChromaFilter ) << kChromaFilterShift ) | - ((uint32_t)(desc.forceExplicitReconstruction ) << kForceExplicitReconShift) | - ((uint32_t)(desc.vkComponentSwizzleRed ) << kComponentRShift ) | - ((uint32_t)(desc.vkComponentSwizzleGreen ) << kComponentGShift ) | - ((uint32_t)(desc.vkComponentSwizzleBlue ) << kComponentBShift ) | - ((uint32_t)(desc.vkComponentSwizzleAlpha ) << kComponentAShift )); + (SKGPU_PACK_FIELD(usesExternalFormat, kUsesExternalFormatBits, kUsesExternalFormatShift) | + SKGPU_PACK_FIELD(desc.vkYCbCrModel, kYcbcrModelBits, kYcbcrModelShift ) | + SKGPU_PACK_FIELD(desc.vkYCbCrRange, kYcbcrRangeBits, kYcbcrRangeShift ) | + SKGPU_PACK_FIELD(desc.vkXChromaOffset, kXChromaOffsetBits, kXChromaOffsetShift ) | + SKGPU_PACK_FIELD(desc.vkYChromaOffset, kYChromaOffsetBits, kYChromaOffsetShift ) | + SKGPU_PACK_FIELD(desc.vkChromaFilter, kChromaFilterBits, kChromaFilterShift ) | + SKGPU_PACK_FIELD(desc.forceExplicitReconstruction, kForceExplicitReconBits, kForceExplicitReconShift) | + SKGPU_PACK_FIELD(desc.vkComponentSwizzleRed, kComponentBits, kComponentRShift ) | + SKGPU_PACK_FIELD(desc.vkComponentSwizzleGreen, kComponentBits, kComponentGShift ) | + SKGPU_PACK_FIELD(desc.vkComponentSwizzleBlue, kComponentBits, kComponentBShift ) | + SKGPU_PACK_FIELD(desc.vkComponentSwizzleAlpha, kComponentBits, kComponentAShift )); + #undef SKGPU_PACK_FIELD info.fFormat = usesExternalFormat ? desc.externalFormat : desc.vkFormat; return info; }