// Copyright 2020 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef DAWNNATIVE_SUBRESOURCE_H_ #define DAWNNATIVE_SUBRESOURCE_H_ #include "dawn_native/EnumClassBitmasks.h" #include "dawn_native/dawn_platform.h" namespace dawn_native { // Note: Subresource indices are computed by iterating the aspects in increasing order. // D3D12 uses these directly, so the order much match D3D12's indices. // - Depth/Stencil textures have Depth as Plane 0, and Stencil as Plane 1. enum class Aspect : uint8_t { None = 0x0, Color = 0x1, Depth = 0x2, Stencil = 0x4, // Aspects used to select individual planes in a multi-planar format. Plane0 = 0x8, Plane1 = 0x10, // An aspect for that represents the combination of both the depth and stencil aspects. It // can be ignored outside of the Vulkan backend. CombinedDepthStencil = 0x20, }; template <> struct EnumBitmaskSize<Aspect> { static constexpr unsigned value = 6; }; // Convert the TextureAspect to an Aspect mask for the format. ASSERTs if the aspect // does not exist in the format. // Also ASSERTs if "All" is selected and results in more than one aspect. Aspect ConvertSingleAspect(const Format& format, wgpu::TextureAspect aspect); // Convert the TextureAspect to an Aspect mask for the format. ASSERTs if the aspect // does not exist in the format. Aspect ConvertAspect(const Format& format, wgpu::TextureAspect aspect); // Returns the Aspects of the Format that are selected by the wgpu::TextureAspect. // Note that this can return Aspect::None if the Format doesn't have any of the // selected aspects. Aspect SelectFormatAspects(const Format& format, wgpu::TextureAspect aspect); // Convert TextureAspect to the aspect which corresponds to the view format. This // special cases per plane view formats before calling ConvertAspect. Aspect ConvertViewAspect(const Format& format, wgpu::TextureAspect aspect); // Helper struct to make it clear that what the parameters of a range mean. template <typename T> struct FirstAndCountRange { T first; T count; }; struct SubresourceRange { SubresourceRange(Aspect aspects, FirstAndCountRange<uint32_t> arrayLayerParam, FirstAndCountRange<uint32_t> mipLevelParams); SubresourceRange(); Aspect aspects; uint32_t baseArrayLayer; uint32_t layerCount; uint32_t baseMipLevel; uint32_t levelCount; static SubresourceRange SingleMipAndLayer(uint32_t baseMipLevel, uint32_t baseArrayLayer, Aspect aspects); static SubresourceRange MakeSingle(Aspect aspect, uint32_t baseArrayLayer, uint32_t baseMipLevel); static SubresourceRange MakeFull(Aspect aspects, uint32_t layerCount, uint32_t levelCount); }; // Helper function to use aspects as linear indices in arrays. uint8_t GetAspectIndex(Aspect aspect); uint8_t GetAspectCount(Aspect aspects); // The maximum number of planes per format Dawn knows about. Asserts in BuildFormatTable that // the per plane index does not exceed the known maximum plane count. static constexpr uint32_t kMaxPlanesPerFormat = 3; } // namespace dawn_native namespace dawn { template <> struct IsDawnBitmask<dawn_native::Aspect> { static constexpr bool enable = true; }; } // namespace dawn #endif // DAWNNATIVE_SUBRESOURCE_H_