@@ -602,37 +602,49 @@ bool CopySrcNeedsInternalTextureBindingUsage(const DeviceBase* device, const For
602602 return false ;
603603}
604604
605- wgpu::TextureViewDimension ResolveDefaultCompatiblityTextureBindingViewDimension (
605+ wgpu::TextureViewDimension ResolveDefaultCompatiblityTextureBindingViewDimensionImpl (
606606 const DeviceBase* device,
607- const UnpackedPtr<TextureDescriptor>& descriptor) {
607+ wgpu::TextureDimension dimension,
608+ uint32_t depthOrArrayLayers,
609+ wgpu::TextureViewDimension textureBindingViewDimension) {
608610 // In non-compatibility mode this value is not used so return undefined so that it is not
609611 // used by mistake.
610612 if (device->HasFlexibleTextureViews ()) {
611613 return wgpu::TextureViewDimension::Undefined;
612614 }
613615
614- auto textureBindingViewDimension = wgpu::TextureViewDimension::Undefined;
615- if (auto * subDesc = descriptor.Get <TextureBindingViewDimensionDescriptor>()) {
616- textureBindingViewDimension = subDesc->textureBindingViewDimension ;
617- }
618616 if (textureBindingViewDimension != wgpu::TextureViewDimension::Undefined) {
619617 return textureBindingViewDimension;
620618 }
621619
622- switch (descriptor-> dimension ) {
620+ switch (dimension) {
623621 case wgpu::TextureDimension::e1D:
624622 return wgpu::TextureViewDimension::e1D;
625623 case wgpu::TextureDimension::e2D:
626- return descriptor-> size . depthOrArrayLayers == 1 ? wgpu::TextureViewDimension::e2D
627- : wgpu::TextureViewDimension::e2DArray;
624+ return depthOrArrayLayers == 1 ? wgpu::TextureViewDimension::e2D
625+ : wgpu::TextureViewDimension::e2DArray;
628626 case wgpu::TextureDimension::e3D:
629627 return wgpu::TextureViewDimension::e3D;
630628 case wgpu::TextureDimension::Undefined:
631629 default :
632- DAWN_UNREACHABLE ();
630+ // We could get here on an error texture.
631+ return wgpu::TextureViewDimension::Undefined;
633632 }
634633}
635634
635+ wgpu::TextureViewDimension ResolveDefaultCompatiblityTextureBindingViewDimension (
636+ const DeviceBase* device,
637+ const UnpackedPtr<TextureDescriptor>& descriptor) {
638+ auto textureBindingViewDimension = wgpu::TextureViewDimension::Undefined;
639+ if (auto * subDesc = descriptor.Get <TextureBindingViewDimensionDescriptor>()) {
640+ textureBindingViewDimension = subDesc->textureBindingViewDimension ;
641+ }
642+
643+ return ResolveDefaultCompatiblityTextureBindingViewDimensionImpl (
644+ device, descriptor->dimension , descriptor->size .depthOrArrayLayers ,
645+ textureBindingViewDimension);
646+ }
647+
636648wgpu::TextureUsage AddInternalUsages (const DeviceBase* device,
637649 wgpu::TextureUsage usage,
638650 const Format& format,
@@ -1023,7 +1035,21 @@ TextureBase::TextureBase(DeviceBase* device,
10231035 mMipLevelCount(descriptor->mipLevelCount),
10241036 mSampleCount(descriptor->sampleCount),
10251037 mUsage(descriptor->usage),
1026- mFormatEnumForReflection(descriptor->format) {}
1038+ mFormatEnumForReflection(descriptor->format) {
1039+ auto textureBindingViewDimension = wgpu::TextureViewDimension::Undefined;
1040+ for (const wgpu::ChainedStruct* chain = descriptor->nextInChain ; chain != nullptr ;
1041+ chain = chain->nextInChain ) {
1042+ if (chain->sType == wgpu::SType::TextureBindingViewDimensionDescriptor) {
1043+ textureBindingViewDimension =
1044+ reinterpret_cast <const TextureBindingViewDimensionDescriptor*>(chain)
1045+ ->textureBindingViewDimension ;
1046+ }
1047+ }
1048+
1049+ mCompatibilityTextureBindingViewDimension =
1050+ ResolveDefaultCompatiblityTextureBindingViewDimensionImpl (
1051+ device, mDimension , mBaseSize .depthOrArrayLayers , textureBindingViewDimension);
1052+ }
10271053
10281054void TextureBase::DestroyImpl () {
10291055 // TODO(crbug.com/dawn/831): DestroyImpl is called from two places.
@@ -1545,6 +1571,10 @@ wgpu::TextureUsage TextureBase::APIGetUsage() const {
15451571 return mUsage ;
15461572}
15471573
1574+ wgpu::TextureViewDimension TextureBase::APIGetTextureBindingViewDimension () const {
1575+ return mCompatibilityTextureBindingViewDimension ;
1576+ }
1577+
15481578void TextureBase::APIPin (wgpu::TextureUsage usage) {
15491579 // There is no status to return so we don't need to handle the case where an error has been
15501580 // consumed.
0 commit comments