1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © Microsoft Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "dzn_private.h"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_debug_report.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_format.h"
29*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker void
dzn_image_align_extent(const struct dzn_image * image,VkExtent3D * extent)32*61046927SAndroid Build Coastguard Worker dzn_image_align_extent(const struct dzn_image *image,
33*61046927SAndroid Build Coastguard Worker VkExtent3D *extent)
34*61046927SAndroid Build Coastguard Worker {
35*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(image->vk.format);
36*61046927SAndroid Build Coastguard Worker uint32_t blkw = util_format_get_blockwidth(pfmt);
37*61046927SAndroid Build Coastguard Worker uint32_t blkh = util_format_get_blockheight(pfmt);
38*61046927SAndroid Build Coastguard Worker uint32_t blkd = util_format_get_blockdepth(pfmt);
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker assert(util_is_power_of_two_nonzero(blkw) &&
41*61046927SAndroid Build Coastguard Worker util_is_power_of_two_nonzero(blkh) &&
42*61046927SAndroid Build Coastguard Worker util_is_power_of_two_nonzero(blkh));
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker extent->width = ALIGN_POT(extent->width, blkw);
45*61046927SAndroid Build Coastguard Worker extent->height = ALIGN_POT(extent->height, blkh);
46*61046927SAndroid Build Coastguard Worker extent->depth = ALIGN_POT(extent->depth, blkd);
47*61046927SAndroid Build Coastguard Worker }
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker static void
dzn_image_destroy(struct dzn_image * image,const VkAllocationCallbacks * pAllocator)50*61046927SAndroid Build Coastguard Worker dzn_image_destroy(struct dzn_image *image,
51*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
52*61046927SAndroid Build Coastguard Worker {
53*61046927SAndroid Build Coastguard Worker if (!image)
54*61046927SAndroid Build Coastguard Worker return;
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(image->vk.base.device, struct dzn_device, vk);
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker if (image->res)
59*61046927SAndroid Build Coastguard Worker ID3D12Resource_Release(image->res);
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker vk_image_finish(&image->vk);
62*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, image);
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker static VkResult
dzn_image_create(struct dzn_device * device,const VkImageCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImage * out)66*61046927SAndroid Build Coastguard Worker dzn_image_create(struct dzn_device *device,
67*61046927SAndroid Build Coastguard Worker const VkImageCreateInfo *pCreateInfo,
68*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
69*61046927SAndroid Build Coastguard Worker VkImage *out)
70*61046927SAndroid Build Coastguard Worker {
71*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
72*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical, struct dzn_physical_device, vk);
73*61046927SAndroid Build Coastguard Worker VkFormat *compat_formats = NULL;
74*61046927SAndroid Build Coastguard Worker uint32_t compat_format_count = 0;
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker if (pdev->options12.RelaxedFormatCastingSupported) {
77*61046927SAndroid Build Coastguard Worker VkResult ret =
78*61046927SAndroid Build Coastguard Worker vk_image_create_get_format_list(&device->vk, pCreateInfo, pAllocator,
79*61046927SAndroid Build Coastguard Worker &compat_formats, &compat_format_count);
80*61046927SAndroid Build Coastguard Worker if (ret != VK_SUCCESS)
81*61046927SAndroid Build Coastguard Worker return ret;
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker VK_MULTIALLOC(ma);
85*61046927SAndroid Build Coastguard Worker VK_MULTIALLOC_DECL(&ma, struct dzn_image, image, 1);
86*61046927SAndroid Build Coastguard Worker VK_MULTIALLOC_DECL(&ma, DXGI_FORMAT, castable_formats, compat_format_count);
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker if (!vk_multialloc_zalloc2(&ma, &device->vk.alloc, pAllocator, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)) {
89*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, compat_formats);
90*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker #if 0
94*61046927SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlags supported =
95*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT |
96*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT |
97*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT |
98*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT |
99*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT |
100*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT;
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker if (create_info && (create_info->handleTypes & supported))
103*61046927SAndroid Build Coastguard Worker return dzn_image_from_external(device, pCreateInfo, create_info,
104*61046927SAndroid Build Coastguard Worker pAllocator, pImage);
105*61046927SAndroid Build Coastguard Worker #endif
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker #if 0
108*61046927SAndroid Build Coastguard Worker const VkImageSwapchainCreateInfoKHR *swapchain_info = (const VkImageSwapchainCreateInfoKHR *)
109*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pCreateInfo->pNext, IMAGE_SWAPCHAIN_CREATE_INFO_KHR);
110*61046927SAndroid Build Coastguard Worker if (swapchain_info && swapchain_info->swapchain != VK_NULL_HANDLE)
111*61046927SAndroid Build Coastguard Worker return dzn_image_from_swapchain(device, pCreateInfo, swapchain_info,
112*61046927SAndroid Build Coastguard Worker pAllocator, pImage);
113*61046927SAndroid Build Coastguard Worker #endif
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker vk_image_init(&device->vk, &image->vk, pCreateInfo);
116*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(image->vk.format);
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage = image->vk.usage | image->vk.stencil_usage;
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker image->castable_formats = castable_formats;
121*61046927SAndroid Build Coastguard Worker image->castable_format_count = 0;
122*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < compat_format_count; i++) {
123*61046927SAndroid Build Coastguard Worker castable_formats[image->castable_format_count] =
124*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, compat_formats[i], usage, 0);
125*61046927SAndroid Build Coastguard Worker
126*61046927SAndroid Build Coastguard Worker if (castable_formats[image->castable_format_count] != DXGI_FORMAT_UNKNOWN)
127*61046927SAndroid Build Coastguard Worker image->castable_format_count++;
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, compat_formats);
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker image->valid_access = D3D12_BARRIER_ACCESS_COPY_SOURCE | D3D12_BARRIER_ACCESS_COPY_DEST;
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker if (image->vk.tiling == VK_IMAGE_TILING_LINEAR) {
135*61046927SAndroid Build Coastguard Worker /* Treat linear images as buffers: they should only be used as copy
136*61046927SAndroid Build Coastguard Worker * src/dest, and CopyTextureResource() can manipulate buffers.
137*61046927SAndroid Build Coastguard Worker * We only support linear tiling on things strictly required by the spec:
138*61046927SAndroid Build Coastguard Worker * "Images created with tiling equal to VK_IMAGE_TILING_LINEAR have
139*61046927SAndroid Build Coastguard Worker * further restrictions on their limits and capabilities compared to
140*61046927SAndroid Build Coastguard Worker * images created with tiling equal to VK_IMAGE_TILING_OPTIMAL. Creation
141*61046927SAndroid Build Coastguard Worker * of images with tiling VK_IMAGE_TILING_LINEAR may not be supported
142*61046927SAndroid Build Coastguard Worker * unless other parameters meet all of the constraints:
143*61046927SAndroid Build Coastguard Worker * - imageType is VK_IMAGE_TYPE_2D
144*61046927SAndroid Build Coastguard Worker * - format is not a depth/stencil format
145*61046927SAndroid Build Coastguard Worker * - mipLevels is 1
146*61046927SAndroid Build Coastguard Worker * - arrayLayers is 1
147*61046927SAndroid Build Coastguard Worker * - samples is VK_SAMPLE_COUNT_1_BIT
148*61046927SAndroid Build Coastguard Worker * - usage only includes VK_IMAGE_USAGE_TRANSFER_SRC_BIT and/or VK_IMAGE_USAGE_TRANSFER_DST_BIT
149*61046927SAndroid Build Coastguard Worker * "
150*61046927SAndroid Build Coastguard Worker */
151*61046927SAndroid Build Coastguard Worker assert(!vk_format_is_depth_or_stencil(pCreateInfo->format));
152*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->mipLevels == 1);
153*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->arrayLayers == 1);
154*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->samples == 1);
155*61046927SAndroid Build Coastguard Worker assert(pCreateInfo->imageType != VK_IMAGE_TYPE_3D);
156*61046927SAndroid Build Coastguard Worker assert(!(usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)));
157*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC tmp_desc = {
158*61046927SAndroid Build Coastguard Worker .Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D,
159*61046927SAndroid Build Coastguard Worker .Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
160*61046927SAndroid Build Coastguard Worker .Width = ALIGN_POT(image->vk.extent.width, util_format_get_blockwidth(pfmt)),
161*61046927SAndroid Build Coastguard Worker .Height = (UINT)ALIGN_POT(image->vk.extent.height, util_format_get_blockheight(pfmt)),
162*61046927SAndroid Build Coastguard Worker .DepthOrArraySize = 1,
163*61046927SAndroid Build Coastguard Worker .MipLevels = 1,
164*61046927SAndroid Build Coastguard Worker .Format =
165*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, pCreateInfo->format, usage, 0),
166*61046927SAndroid Build Coastguard Worker .SampleDesc = { .Count = 1, .Quality = 0 },
167*61046927SAndroid Build Coastguard Worker .Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
168*61046927SAndroid Build Coastguard Worker .Flags = D3D12_RESOURCE_FLAG_NONE
169*61046927SAndroid Build Coastguard Worker };
170*61046927SAndroid Build Coastguard Worker D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint;
171*61046927SAndroid Build Coastguard Worker uint64_t size = 0;
172*61046927SAndroid Build Coastguard Worker ID3D12Device1_GetCopyableFootprints(device->dev, &tmp_desc, 0, 1, 0, &footprint, NULL, NULL, &size);
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker image->linear.row_stride = footprint.Footprint.RowPitch;
175*61046927SAndroid Build Coastguard Worker image->linear.size = size;
176*61046927SAndroid Build Coastguard Worker size *= pCreateInfo->arrayLayers;
177*61046927SAndroid Build Coastguard Worker image->desc.Format = DXGI_FORMAT_UNKNOWN;
178*61046927SAndroid Build Coastguard Worker image->desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
179*61046927SAndroid Build Coastguard Worker image->desc.Width = size;
180*61046927SAndroid Build Coastguard Worker image->desc.Height = 1;
181*61046927SAndroid Build Coastguard Worker image->desc.DepthOrArraySize = 1;
182*61046927SAndroid Build Coastguard Worker image->desc.MipLevels = 1;
183*61046927SAndroid Build Coastguard Worker image->desc.SampleDesc.Count = 1;
184*61046927SAndroid Build Coastguard Worker image->desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
185*61046927SAndroid Build Coastguard Worker image->castable_formats = NULL;
186*61046927SAndroid Build Coastguard Worker image->castable_format_count = 0;
187*61046927SAndroid Build Coastguard Worker } else {
188*61046927SAndroid Build Coastguard Worker image->desc.Format =
189*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, pCreateInfo->format,
190*61046927SAndroid Build Coastguard Worker usage & ~VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
191*61046927SAndroid Build Coastguard Worker 0),
192*61046927SAndroid Build Coastguard Worker image->desc.Dimension = (D3D12_RESOURCE_DIMENSION)(D3D12_RESOURCE_DIMENSION_TEXTURE1D + pCreateInfo->imageType);
193*61046927SAndroid Build Coastguard Worker image->desc.Width = image->vk.extent.width;
194*61046927SAndroid Build Coastguard Worker image->desc.Height = image->vk.extent.height;
195*61046927SAndroid Build Coastguard Worker image->desc.DepthOrArraySize = pCreateInfo->imageType == VK_IMAGE_TYPE_3D ?
196*61046927SAndroid Build Coastguard Worker image->vk.extent.depth :
197*61046927SAndroid Build Coastguard Worker pCreateInfo->arrayLayers;
198*61046927SAndroid Build Coastguard Worker image->desc.MipLevels = pCreateInfo->mipLevels;
199*61046927SAndroid Build Coastguard Worker image->desc.SampleDesc.Count = pCreateInfo->samples;
200*61046927SAndroid Build Coastguard Worker image->desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
201*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_RESOLVE_DEST |
202*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_SHADER_RESOURCE |
203*61046927SAndroid Build Coastguard Worker (pCreateInfo->samples > 1 ? D3D12_BARRIER_ACCESS_RESOLVE_SOURCE : 0);
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker if ((image->vk.create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) &&
207*61046927SAndroid Build Coastguard Worker !pdev->options12.RelaxedFormatCastingSupported)
208*61046927SAndroid Build Coastguard Worker image->desc.Format = dzn_get_typeless_dxgi_format(image->desc.Format);
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker if (image->desc.SampleDesc.Count > 1)
211*61046927SAndroid Build Coastguard Worker image->desc.Alignment = D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT;
212*61046927SAndroid Build Coastguard Worker else
213*61046927SAndroid Build Coastguard Worker image->desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
214*61046927SAndroid Build Coastguard Worker
215*61046927SAndroid Build Coastguard Worker image->desc.SampleDesc.Quality = 0;
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker image->desc.Flags = D3D12_RESOURCE_FLAG_NONE;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
220*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
221*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker if (usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
225*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
226*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ |
227*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker if (!(usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
230*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_STORAGE_BIT |
231*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
232*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_TRANSFER_SRC_BIT))) {
233*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE;
234*61046927SAndroid Build Coastguard Worker image->valid_access &= ~D3D12_BARRIER_ACCESS_SHADER_RESOURCE;
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker } else if (usage & VK_IMAGE_USAGE_STORAGE_BIT) {
237*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
238*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker /* Images with TRANSFER_DST can be cleared or passed as a blit/resolve
242*61046927SAndroid Build Coastguard Worker * destination. Both operations require the RT or DS cap flags.
243*61046927SAndroid Build Coastguard Worker */
244*61046927SAndroid Build Coastguard Worker if ((usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) &&
245*61046927SAndroid Build Coastguard Worker image->vk.tiling == VK_IMAGE_TILING_OPTIMAL) {
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT dfmt_info =
248*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_support(pdev, pCreateInfo->format, pCreateInfo->flags);
249*61046927SAndroid Build Coastguard Worker if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) {
250*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
251*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
252*61046927SAndroid Build Coastguard Worker } else if ((dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL) &&
253*61046927SAndroid Build Coastguard Worker (image->desc.Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET |
254*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)) == D3D12_RESOURCE_FLAG_NONE) {
255*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
256*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
257*61046927SAndroid Build Coastguard Worker } else if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW) {
258*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
259*61046927SAndroid Build Coastguard Worker image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT &&
264*61046927SAndroid Build Coastguard Worker !(image->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) &&
265*61046927SAndroid Build Coastguard Worker image->desc.SampleDesc.Count == 1)
266*61046927SAndroid Build Coastguard Worker image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS;
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker *out = dzn_image_to_handle(image);
269*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
270*61046927SAndroid Build Coastguard Worker }
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
dzn_image_get_dxgi_format(const struct dzn_physical_device * pdev,VkFormat format,VkImageUsageFlags usage,VkImageAspectFlags aspects)273*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(const struct dzn_physical_device *pdev,
274*61046927SAndroid Build Coastguard Worker VkFormat format,
275*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage,
276*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspects)
277*61046927SAndroid Build Coastguard Worker {
278*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(format);
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker if (pdev && !pdev->support_a4b4g4r4) {
281*61046927SAndroid Build Coastguard Worker if (pfmt == PIPE_FORMAT_A4R4G4B4_UNORM)
282*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_B4G4R4A4_UNORM;
283*61046927SAndroid Build Coastguard Worker if (pfmt == PIPE_FORMAT_A4B4G4R4_UNORM)
284*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_UNKNOWN;
285*61046927SAndroid Build Coastguard Worker }
286*61046927SAndroid Build Coastguard Worker
287*61046927SAndroid Build Coastguard Worker if (!vk_format_is_depth_or_stencil(format))
288*61046927SAndroid Build Coastguard Worker return dzn_pipe_to_dxgi_format(pfmt);
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker switch (pfmt) {
291*61046927SAndroid Build Coastguard Worker case PIPE_FORMAT_Z16_UNORM:
292*61046927SAndroid Build Coastguard Worker return usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ?
293*61046927SAndroid Build Coastguard Worker DXGI_FORMAT_D16_UNORM : DXGI_FORMAT_R16_UNORM;
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker case PIPE_FORMAT_Z32_FLOAT:
296*61046927SAndroid Build Coastguard Worker return usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ?
297*61046927SAndroid Build Coastguard Worker DXGI_FORMAT_D32_FLOAT : DXGI_FORMAT_R32_FLOAT;
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker case PIPE_FORMAT_Z24X8_UNORM:
300*61046927SAndroid Build Coastguard Worker if (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
301*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_D24_UNORM_S8_UINT;
302*61046927SAndroid Build Coastguard Worker if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT)
303*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
304*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R24G8_TYPELESS;
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker case PIPE_FORMAT_Z24_UNORM_S8_UINT:
307*61046927SAndroid Build Coastguard Worker if (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
308*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_D24_UNORM_S8_UINT;
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT)
311*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
312*61046927SAndroid Build Coastguard Worker else if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT)
313*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_X24_TYPELESS_G8_UINT;
314*61046927SAndroid Build Coastguard Worker else
315*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R24G8_TYPELESS;
316*61046927SAndroid Build Coastguard Worker
317*61046927SAndroid Build Coastguard Worker case PIPE_FORMAT_X24S8_UINT:
318*61046927SAndroid Build Coastguard Worker if (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
319*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_D24_UNORM_S8_UINT;
320*61046927SAndroid Build Coastguard Worker if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT)
321*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_X24_TYPELESS_G8_UINT;
322*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R24G8_TYPELESS;
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
325*61046927SAndroid Build Coastguard Worker if (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
326*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT)
329*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;
330*61046927SAndroid Build Coastguard Worker else if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT)
331*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT;
332*61046927SAndroid Build Coastguard Worker else
333*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R32G8X24_TYPELESS;
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker default:
336*61046927SAndroid Build Coastguard Worker return dzn_pipe_to_dxgi_format(pfmt);
337*61046927SAndroid Build Coastguard Worker }
338*61046927SAndroid Build Coastguard Worker }
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
dzn_image_get_placed_footprint_format(const struct dzn_physical_device * pdev,VkFormat format,VkImageAspectFlags aspect)341*61046927SAndroid Build Coastguard Worker dzn_image_get_placed_footprint_format(const struct dzn_physical_device *pdev,
342*61046927SAndroid Build Coastguard Worker VkFormat format,
343*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspect)
344*61046927SAndroid Build Coastguard Worker {
345*61046927SAndroid Build Coastguard Worker DXGI_FORMAT out =
346*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, format,
347*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
348*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_TRANSFER_DST_BIT,
349*61046927SAndroid Build Coastguard Worker aspect);
350*61046927SAndroid Build Coastguard Worker
351*61046927SAndroid Build Coastguard Worker switch (out) {
352*61046927SAndroid Build Coastguard Worker case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
353*61046927SAndroid Build Coastguard Worker case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
354*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R32_TYPELESS;
355*61046927SAndroid Build Coastguard Worker case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
356*61046927SAndroid Build Coastguard Worker case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
357*61046927SAndroid Build Coastguard Worker return DXGI_FORMAT_R8_TYPELESS;
358*61046927SAndroid Build Coastguard Worker default:
359*61046927SAndroid Build Coastguard Worker return out;
360*61046927SAndroid Build Coastguard Worker }
361*61046927SAndroid Build Coastguard Worker }
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker VkFormat
dzn_image_get_plane_format(VkFormat format,VkImageAspectFlags aspectMask)364*61046927SAndroid Build Coastguard Worker dzn_image_get_plane_format(VkFormat format,
365*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspectMask)
366*61046927SAndroid Build Coastguard Worker {
367*61046927SAndroid Build Coastguard Worker if (aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT)
368*61046927SAndroid Build Coastguard Worker return vk_format_stencil_only(format);
369*61046927SAndroid Build Coastguard Worker else if (aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT)
370*61046927SAndroid Build Coastguard Worker return vk_format_depth_only(format);
371*61046927SAndroid Build Coastguard Worker else
372*61046927SAndroid Build Coastguard Worker return format;
373*61046927SAndroid Build Coastguard Worker }
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker uint32_t
dzn_image_layers_get_subresource_index(const struct dzn_image * image,const VkImageSubresourceLayers * subres,VkImageAspectFlagBits aspect,uint32_t layer)376*61046927SAndroid Build Coastguard Worker dzn_image_layers_get_subresource_index(const struct dzn_image *image,
377*61046927SAndroid Build Coastguard Worker const VkImageSubresourceLayers *subres,
378*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
379*61046927SAndroid Build Coastguard Worker uint32_t layer)
380*61046927SAndroid Build Coastguard Worker {
381*61046927SAndroid Build Coastguard Worker int planeSlice =
382*61046927SAndroid Build Coastguard Worker aspect == VK_IMAGE_ASPECT_STENCIL_BIT ? 1 : 0;
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker return subres->mipLevel +
385*61046927SAndroid Build Coastguard Worker ((subres->baseArrayLayer + layer) * image->desc.MipLevels) +
386*61046927SAndroid Build Coastguard Worker (planeSlice * image->desc.MipLevels * image->desc.DepthOrArraySize);
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker uint32_t
dzn_image_range_get_subresource_index(const struct dzn_image * image,const VkImageSubresourceRange * subres,VkImageAspectFlagBits aspect,uint32_t level,uint32_t layer)390*61046927SAndroid Build Coastguard Worker dzn_image_range_get_subresource_index(const struct dzn_image *image,
391*61046927SAndroid Build Coastguard Worker const VkImageSubresourceRange *subres,
392*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
393*61046927SAndroid Build Coastguard Worker uint32_t level, uint32_t layer)
394*61046927SAndroid Build Coastguard Worker {
395*61046927SAndroid Build Coastguard Worker int planeSlice =
396*61046927SAndroid Build Coastguard Worker aspect == VK_IMAGE_ASPECT_STENCIL_BIT ? 1 : 0;
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker return subres->baseMipLevel + level +
399*61046927SAndroid Build Coastguard Worker ((subres->baseArrayLayer + layer) * image->desc.MipLevels) +
400*61046927SAndroid Build Coastguard Worker (planeSlice * image->desc.MipLevels * image->desc.DepthOrArraySize);
401*61046927SAndroid Build Coastguard Worker }
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker static uint32_t
dzn_image_get_subresource_index(const struct dzn_image * image,const VkImageSubresource * subres,VkImageAspectFlagBits aspect)404*61046927SAndroid Build Coastguard Worker dzn_image_get_subresource_index(const struct dzn_image *image,
405*61046927SAndroid Build Coastguard Worker const VkImageSubresource *subres,
406*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
407*61046927SAndroid Build Coastguard Worker {
408*61046927SAndroid Build Coastguard Worker int planeSlice =
409*61046927SAndroid Build Coastguard Worker aspect == VK_IMAGE_ASPECT_STENCIL_BIT ? 1 : 0;
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker return subres->mipLevel +
412*61046927SAndroid Build Coastguard Worker (subres->arrayLayer * image->desc.MipLevels) +
413*61046927SAndroid Build Coastguard Worker (planeSlice * image->desc.MipLevels * image->desc.DepthOrArraySize);
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker
416*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION
dzn_image_get_copy_loc(const struct dzn_image * image,const VkImageSubresourceLayers * subres,VkImageAspectFlagBits aspect,uint32_t layer)417*61046927SAndroid Build Coastguard Worker dzn_image_get_copy_loc(const struct dzn_image *image,
418*61046927SAndroid Build Coastguard Worker const VkImageSubresourceLayers *subres,
419*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
420*61046927SAndroid Build Coastguard Worker uint32_t layer)
421*61046927SAndroid Build Coastguard Worker {
422*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
423*61046927SAndroid Build Coastguard Worker container_of(image->vk.base.device->physical, struct dzn_physical_device, vk);
424*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION loc = {
425*61046927SAndroid Build Coastguard Worker .pResource = image->res,
426*61046927SAndroid Build Coastguard Worker };
427*61046927SAndroid Build Coastguard Worker
428*61046927SAndroid Build Coastguard Worker assert((subres->aspectMask & aspect) != 0);
429*61046927SAndroid Build Coastguard Worker
430*61046927SAndroid Build Coastguard Worker if (image->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) {
431*61046927SAndroid Build Coastguard Worker assert((subres->baseArrayLayer + layer) == 0);
432*61046927SAndroid Build Coastguard Worker assert(subres->mipLevel == 0);
433*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(image->vk.format);
434*61046927SAndroid Build Coastguard Worker uint32_t blkw = util_format_get_blockwidth(pfmt);
435*61046927SAndroid Build Coastguard Worker uint32_t blkh = util_format_get_blockheight(pfmt);
436*61046927SAndroid Build Coastguard Worker uint32_t blkd = util_format_get_blockdepth(pfmt);
437*61046927SAndroid Build Coastguard Worker loc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
438*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Offset = 0;
439*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Footprint.Format =
440*61046927SAndroid Build Coastguard Worker dzn_image_get_placed_footprint_format(pdev, image->vk.format, aspect);
441*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Footprint.Width = ALIGN_POT(image->vk.extent.width, blkw);
442*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Footprint.Height = ALIGN_POT(image->vk.extent.height, blkh);
443*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Footprint.Depth = ALIGN_POT(image->vk.extent.depth, blkd);
444*61046927SAndroid Build Coastguard Worker loc.PlacedFootprint.Footprint.RowPitch = image->linear.row_stride;
445*61046927SAndroid Build Coastguard Worker } else {
446*61046927SAndroid Build Coastguard Worker loc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
447*61046927SAndroid Build Coastguard Worker loc.SubresourceIndex = dzn_image_layers_get_subresource_index(image, subres, aspect, layer);
448*61046927SAndroid Build Coastguard Worker }
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker return loc;
451*61046927SAndroid Build Coastguard Worker }
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker D3D12_DEPTH_STENCIL_VIEW_DESC
dzn_image_get_dsv_desc(const struct dzn_image * image,const VkImageSubresourceRange * range,uint32_t level)454*61046927SAndroid Build Coastguard Worker dzn_image_get_dsv_desc(const struct dzn_image *image,
455*61046927SAndroid Build Coastguard Worker const VkImageSubresourceRange *range,
456*61046927SAndroid Build Coastguard Worker uint32_t level)
457*61046927SAndroid Build Coastguard Worker {
458*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
459*61046927SAndroid Build Coastguard Worker container_of(image->vk.base.device->physical, struct dzn_physical_device, vk);
460*61046927SAndroid Build Coastguard Worker uint32_t layer_count = dzn_get_layer_count(image, range);
461*61046927SAndroid Build Coastguard Worker D3D12_DEPTH_STENCIL_VIEW_DESC dsv_desc = {
462*61046927SAndroid Build Coastguard Worker .Format =
463*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, image->vk.format,
464*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
465*61046927SAndroid Build Coastguard Worker range->aspectMask),
466*61046927SAndroid Build Coastguard Worker };
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker switch (image->vk.image_type) {
469*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_1D:
470*61046927SAndroid Build Coastguard Worker dsv_desc.ViewDimension =
471*61046927SAndroid Build Coastguard Worker image->vk.array_layers > 1 ?
472*61046927SAndroid Build Coastguard Worker D3D12_DSV_DIMENSION_TEXTURE1DARRAY :
473*61046927SAndroid Build Coastguard Worker D3D12_DSV_DIMENSION_TEXTURE1D;
474*61046927SAndroid Build Coastguard Worker break;
475*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_2D:
476*61046927SAndroid Build Coastguard Worker if (image->vk.array_layers > 1) {
477*61046927SAndroid Build Coastguard Worker dsv_desc.ViewDimension =
478*61046927SAndroid Build Coastguard Worker image->vk.samples > 1 ?
479*61046927SAndroid Build Coastguard Worker D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY :
480*61046927SAndroid Build Coastguard Worker D3D12_DSV_DIMENSION_TEXTURE2DARRAY;
481*61046927SAndroid Build Coastguard Worker } else {
482*61046927SAndroid Build Coastguard Worker dsv_desc.ViewDimension =
483*61046927SAndroid Build Coastguard Worker image->vk.samples > 1 ?
484*61046927SAndroid Build Coastguard Worker D3D12_DSV_DIMENSION_TEXTURE2DMS :
485*61046927SAndroid Build Coastguard Worker D3D12_DSV_DIMENSION_TEXTURE2D;
486*61046927SAndroid Build Coastguard Worker }
487*61046927SAndroid Build Coastguard Worker break;
488*61046927SAndroid Build Coastguard Worker default:
489*61046927SAndroid Build Coastguard Worker unreachable("Invalid image type");
490*61046927SAndroid Build Coastguard Worker }
491*61046927SAndroid Build Coastguard Worker
492*61046927SAndroid Build Coastguard Worker switch (dsv_desc.ViewDimension) {
493*61046927SAndroid Build Coastguard Worker case D3D12_DSV_DIMENSION_TEXTURE1D:
494*61046927SAndroid Build Coastguard Worker dsv_desc.Texture1D.MipSlice = range->baseMipLevel + level;
495*61046927SAndroid Build Coastguard Worker break;
496*61046927SAndroid Build Coastguard Worker case D3D12_DSV_DIMENSION_TEXTURE1DARRAY:
497*61046927SAndroid Build Coastguard Worker dsv_desc.Texture1DArray.MipSlice = range->baseMipLevel + level;
498*61046927SAndroid Build Coastguard Worker dsv_desc.Texture1DArray.FirstArraySlice = range->baseArrayLayer;
499*61046927SAndroid Build Coastguard Worker dsv_desc.Texture1DArray.ArraySize = layer_count;
500*61046927SAndroid Build Coastguard Worker break;
501*61046927SAndroid Build Coastguard Worker case D3D12_DSV_DIMENSION_TEXTURE2D:
502*61046927SAndroid Build Coastguard Worker dsv_desc.Texture2D.MipSlice = range->baseMipLevel + level;
503*61046927SAndroid Build Coastguard Worker break;
504*61046927SAndroid Build Coastguard Worker case D3D12_DSV_DIMENSION_TEXTURE2DMS:
505*61046927SAndroid Build Coastguard Worker break;
506*61046927SAndroid Build Coastguard Worker case D3D12_DSV_DIMENSION_TEXTURE2DARRAY:
507*61046927SAndroid Build Coastguard Worker dsv_desc.Texture2DArray.MipSlice = range->baseMipLevel + level;
508*61046927SAndroid Build Coastguard Worker dsv_desc.Texture2DArray.FirstArraySlice = range->baseArrayLayer;
509*61046927SAndroid Build Coastguard Worker dsv_desc.Texture2DArray.ArraySize = layer_count;
510*61046927SAndroid Build Coastguard Worker break;
511*61046927SAndroid Build Coastguard Worker case D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY:
512*61046927SAndroid Build Coastguard Worker dsv_desc.Texture2DMSArray.FirstArraySlice = range->baseArrayLayer;
513*61046927SAndroid Build Coastguard Worker dsv_desc.Texture2DMSArray.ArraySize = layer_count;
514*61046927SAndroid Build Coastguard Worker break;
515*61046927SAndroid Build Coastguard Worker default:
516*61046927SAndroid Build Coastguard Worker unreachable("Invalid view dimension");
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker
519*61046927SAndroid Build Coastguard Worker return dsv_desc;
520*61046927SAndroid Build Coastguard Worker }
521*61046927SAndroid Build Coastguard Worker
522*61046927SAndroid Build Coastguard Worker D3D12_RENDER_TARGET_VIEW_DESC
dzn_image_get_rtv_desc(const struct dzn_image * image,const VkImageSubresourceRange * range,uint32_t level)523*61046927SAndroid Build Coastguard Worker dzn_image_get_rtv_desc(const struct dzn_image *image,
524*61046927SAndroid Build Coastguard Worker const VkImageSubresourceRange *range,
525*61046927SAndroid Build Coastguard Worker uint32_t level)
526*61046927SAndroid Build Coastguard Worker {
527*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
528*61046927SAndroid Build Coastguard Worker container_of(image->vk.base.device->physical, struct dzn_physical_device, vk);
529*61046927SAndroid Build Coastguard Worker uint32_t layer_count = dzn_get_layer_count(image, range);
530*61046927SAndroid Build Coastguard Worker D3D12_RENDER_TARGET_VIEW_DESC rtv_desc = {
531*61046927SAndroid Build Coastguard Worker .Format =
532*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, image->vk.format,
533*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
534*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_COLOR_BIT),
535*61046927SAndroid Build Coastguard Worker };
536*61046927SAndroid Build Coastguard Worker
537*61046927SAndroid Build Coastguard Worker switch (image->vk.image_type) {
538*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_1D:
539*61046927SAndroid Build Coastguard Worker rtv_desc.ViewDimension =
540*61046927SAndroid Build Coastguard Worker image->vk.array_layers > 1 ?
541*61046927SAndroid Build Coastguard Worker D3D12_RTV_DIMENSION_TEXTURE1DARRAY : D3D12_RTV_DIMENSION_TEXTURE1D;
542*61046927SAndroid Build Coastguard Worker break;
543*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_2D:
544*61046927SAndroid Build Coastguard Worker if (image->vk.array_layers > 1) {
545*61046927SAndroid Build Coastguard Worker rtv_desc.ViewDimension =
546*61046927SAndroid Build Coastguard Worker image->vk.samples > 1 ?
547*61046927SAndroid Build Coastguard Worker D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY :
548*61046927SAndroid Build Coastguard Worker D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
549*61046927SAndroid Build Coastguard Worker } else {
550*61046927SAndroid Build Coastguard Worker rtv_desc.ViewDimension =
551*61046927SAndroid Build Coastguard Worker image->vk.samples > 1 ?
552*61046927SAndroid Build Coastguard Worker D3D12_RTV_DIMENSION_TEXTURE2DMS :
553*61046927SAndroid Build Coastguard Worker D3D12_RTV_DIMENSION_TEXTURE2D;
554*61046927SAndroid Build Coastguard Worker }
555*61046927SAndroid Build Coastguard Worker break;
556*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_3D:
557*61046927SAndroid Build Coastguard Worker rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
558*61046927SAndroid Build Coastguard Worker break;
559*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid image type\n");
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker switch (rtv_desc.ViewDimension) {
563*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE1D:
564*61046927SAndroid Build Coastguard Worker rtv_desc.Texture1D.MipSlice = range->baseMipLevel + level;
565*61046927SAndroid Build Coastguard Worker break;
566*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE1DARRAY:
567*61046927SAndroid Build Coastguard Worker rtv_desc.Texture1DArray.MipSlice = range->baseMipLevel + level;
568*61046927SAndroid Build Coastguard Worker rtv_desc.Texture1DArray.FirstArraySlice = range->baseArrayLayer;
569*61046927SAndroid Build Coastguard Worker rtv_desc.Texture1DArray.ArraySize = layer_count;
570*61046927SAndroid Build Coastguard Worker break;
571*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE2D:
572*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2D.MipSlice = range->baseMipLevel + level;
573*61046927SAndroid Build Coastguard Worker if (range->aspectMask & VK_IMAGE_ASPECT_PLANE_1_BIT)
574*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2D.PlaneSlice = 1;
575*61046927SAndroid Build Coastguard Worker else if (range->aspectMask & VK_IMAGE_ASPECT_PLANE_2_BIT)
576*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2D.PlaneSlice = 2;
577*61046927SAndroid Build Coastguard Worker else
578*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2D.PlaneSlice = 0;
579*61046927SAndroid Build Coastguard Worker break;
580*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE2DMS:
581*61046927SAndroid Build Coastguard Worker break;
582*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE2DARRAY:
583*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DArray.MipSlice = range->baseMipLevel + level;
584*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DArray.FirstArraySlice = range->baseArrayLayer;
585*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DArray.ArraySize = layer_count;
586*61046927SAndroid Build Coastguard Worker if (range->aspectMask & VK_IMAGE_ASPECT_PLANE_1_BIT)
587*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DArray.PlaneSlice = 1;
588*61046927SAndroid Build Coastguard Worker else if (range->aspectMask & VK_IMAGE_ASPECT_PLANE_2_BIT)
589*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DArray.PlaneSlice = 2;
590*61046927SAndroid Build Coastguard Worker else
591*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DArray.PlaneSlice = 0;
592*61046927SAndroid Build Coastguard Worker break;
593*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY:
594*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DMSArray.FirstArraySlice = range->baseArrayLayer;
595*61046927SAndroid Build Coastguard Worker rtv_desc.Texture2DMSArray.ArraySize = layer_count;
596*61046927SAndroid Build Coastguard Worker break;
597*61046927SAndroid Build Coastguard Worker case D3D12_RTV_DIMENSION_TEXTURE3D:
598*61046927SAndroid Build Coastguard Worker rtv_desc.Texture3D.MipSlice = range->baseMipLevel + level;
599*61046927SAndroid Build Coastguard Worker rtv_desc.Texture3D.FirstWSlice = range->baseArrayLayer;
600*61046927SAndroid Build Coastguard Worker rtv_desc.Texture3D.WSize =
601*61046927SAndroid Build Coastguard Worker range->layerCount == VK_REMAINING_ARRAY_LAYERS ? -1 : layer_count;
602*61046927SAndroid Build Coastguard Worker break;
603*61046927SAndroid Build Coastguard Worker default:
604*61046927SAndroid Build Coastguard Worker unreachable("Invalid ViewDimension");
605*61046927SAndroid Build Coastguard Worker }
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker return rtv_desc;
608*61046927SAndroid Build Coastguard Worker }
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATES
dzn_image_layout_to_state(const struct dzn_image * image,VkImageLayout layout,VkImageAspectFlagBits aspect,D3D12_COMMAND_LIST_TYPE type)611*61046927SAndroid Build Coastguard Worker dzn_image_layout_to_state(const struct dzn_image *image,
612*61046927SAndroid Build Coastguard Worker VkImageLayout layout,
613*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
614*61046927SAndroid Build Coastguard Worker D3D12_COMMAND_LIST_TYPE type)
615*61046927SAndroid Build Coastguard Worker {
616*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATES shaders_access =
617*61046927SAndroid Build Coastguard Worker (image->desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE) ?
618*61046927SAndroid Build Coastguard Worker 0 : (type == D3D12_COMMAND_LIST_TYPE_DIRECT ?
619*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE :
620*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker switch (layout) {
623*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_PREINITIALIZED:
624*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_UNDEFINED:
625*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_GENERAL:
626*61046927SAndroid Build Coastguard Worker /* YOLO! */
627*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
628*61046927SAndroid Build Coastguard Worker return D3D12_RESOURCE_STATE_COMMON;
629*61046927SAndroid Build Coastguard Worker
630*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
631*61046927SAndroid Build Coastguard Worker return D3D12_RESOURCE_STATE_COPY_DEST;
632*61046927SAndroid Build Coastguard Worker
633*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
634*61046927SAndroid Build Coastguard Worker return D3D12_RESOURCE_STATE_COPY_SOURCE;
635*61046927SAndroid Build Coastguard Worker
636*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
637*61046927SAndroid Build Coastguard Worker return type == D3D12_COMMAND_LIST_TYPE_DIRECT ?
638*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_RENDER_TARGET : D3D12_RESOURCE_STATE_COMMON;
639*61046927SAndroid Build Coastguard Worker
640*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
641*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
642*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
643*61046927SAndroid Build Coastguard Worker return D3D12_RESOURCE_STATE_DEPTH_WRITE;
644*61046927SAndroid Build Coastguard Worker
645*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
646*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
647*61046927SAndroid Build Coastguard Worker return D3D12_RESOURCE_STATE_DEPTH_READ | shaders_access;
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
650*61046927SAndroid Build Coastguard Worker return aspect == VK_IMAGE_ASPECT_STENCIL_BIT ?
651*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_DEPTH_WRITE :
652*61046927SAndroid Build Coastguard Worker (D3D12_RESOURCE_STATE_DEPTH_READ | shaders_access);
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
655*61046927SAndroid Build Coastguard Worker return aspect == VK_IMAGE_ASPECT_STENCIL_BIT ?
656*61046927SAndroid Build Coastguard Worker (D3D12_RESOURCE_STATE_DEPTH_READ | shaders_access) :
657*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_DEPTH_WRITE;
658*61046927SAndroid Build Coastguard Worker
659*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
660*61046927SAndroid Build Coastguard Worker return shaders_access;
661*61046927SAndroid Build Coastguard Worker
662*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT:
663*61046927SAndroid Build Coastguard Worker return D3D12_RESOURCE_STATE_COMMON;
664*61046927SAndroid Build Coastguard Worker
665*61046927SAndroid Build Coastguard Worker default:
666*61046927SAndroid Build Coastguard Worker unreachable("not implemented");
667*61046927SAndroid Build Coastguard Worker }
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT
dzn_vk_layout_to_d3d_layout(VkImageLayout layout,D3D12_COMMAND_LIST_TYPE type,VkImageAspectFlags aspect)671*61046927SAndroid Build Coastguard Worker dzn_vk_layout_to_d3d_layout(VkImageLayout layout,
672*61046927SAndroid Build Coastguard Worker D3D12_COMMAND_LIST_TYPE type,
673*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspect)
674*61046927SAndroid Build Coastguard Worker {
675*61046927SAndroid Build Coastguard Worker if (type == D3D12_COMMAND_LIST_TYPE_COPY)
676*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_COMMON;
677*61046927SAndroid Build Coastguard Worker
678*61046927SAndroid Build Coastguard Worker switch (layout) {
679*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_UNDEFINED:
680*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_UNDEFINED;
681*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_PREINITIALIZED:
682*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_COMMON;
683*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_GENERAL:
684*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
685*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT:
686*61046927SAndroid Build Coastguard Worker switch (type) {
687*61046927SAndroid Build Coastguard Worker case D3D12_COMMAND_LIST_TYPE_DIRECT: return D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON;
688*61046927SAndroid Build Coastguard Worker case D3D12_COMMAND_LIST_TYPE_COMPUTE: return D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COMMON;
689*61046927SAndroid Build Coastguard Worker default: return D3D12_BARRIER_LAYOUT_COMMON;
690*61046927SAndroid Build Coastguard Worker }
691*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL:
692*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
693*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
694*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
695*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
696*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
697*61046927SAndroid Build Coastguard Worker switch (type) {
698*61046927SAndroid Build Coastguard Worker case D3D12_COMMAND_LIST_TYPE_DIRECT: return D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ;
699*61046927SAndroid Build Coastguard Worker case D3D12_COMMAND_LIST_TYPE_COMPUTE: return D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_GENERIC_READ;
700*61046927SAndroid Build Coastguard Worker default: return D3D12_BARRIER_LAYOUT_GENERIC_READ;
701*61046927SAndroid Build Coastguard Worker }
702*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
703*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_RENDER_TARGET;
704*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
705*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
706*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
707*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE;
708*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
709*61046927SAndroid Build Coastguard Worker return aspect == VK_IMAGE_ASPECT_DEPTH_BIT ?
710*61046927SAndroid Build Coastguard Worker dzn_vk_layout_to_d3d_layout(VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, type, aspect) :
711*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE;
712*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
713*61046927SAndroid Build Coastguard Worker return aspect == VK_IMAGE_ASPECT_DEPTH_BIT ?
714*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE :
715*61046927SAndroid Build Coastguard Worker dzn_vk_layout_to_d3d_layout(VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, type, aspect);
716*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL:
717*61046927SAndroid Build Coastguard Worker return aspect == VK_IMAGE_ASPECT_COLOR_BIT ?
718*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT_RENDER_TARGET : D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE;
719*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
720*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
721*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_PRESENT;
722*61046927SAndroid Build Coastguard Worker case VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR:
723*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE;
724*61046927SAndroid Build Coastguard Worker default:
725*61046927SAndroid Build Coastguard Worker assert(!"Unexpected layout");
726*61046927SAndroid Build Coastguard Worker return D3D12_BARRIER_LAYOUT_COMMON;
727*61046927SAndroid Build Coastguard Worker }
728*61046927SAndroid Build Coastguard Worker }
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker bool
dzn_image_formats_are_compatible(const struct dzn_device * device,VkFormat orig_fmt,VkFormat new_fmt,VkImageUsageFlags usage,VkImageAspectFlagBits aspect)731*61046927SAndroid Build Coastguard Worker dzn_image_formats_are_compatible(const struct dzn_device *device,
732*61046927SAndroid Build Coastguard Worker VkFormat orig_fmt, VkFormat new_fmt,
733*61046927SAndroid Build Coastguard Worker VkImageUsageFlags usage,
734*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
735*61046927SAndroid Build Coastguard Worker {
736*61046927SAndroid Build Coastguard Worker const struct dzn_physical_device *pdev =
737*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical, struct dzn_physical_device, vk);
738*61046927SAndroid Build Coastguard Worker DXGI_FORMAT orig_dxgi = dzn_image_get_dxgi_format(pdev, orig_fmt, usage, aspect);
739*61046927SAndroid Build Coastguard Worker DXGI_FORMAT new_dxgi = dzn_image_get_dxgi_format(pdev, new_fmt, usage, aspect);
740*61046927SAndroid Build Coastguard Worker
741*61046927SAndroid Build Coastguard Worker if (orig_dxgi == new_dxgi)
742*61046927SAndroid Build Coastguard Worker return true;
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker DXGI_FORMAT typeless_orig = dzn_get_typeless_dxgi_format(orig_dxgi);
745*61046927SAndroid Build Coastguard Worker DXGI_FORMAT typeless_new = dzn_get_typeless_dxgi_format(new_dxgi);
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker if (!(usage & VK_IMAGE_USAGE_SAMPLED_BIT))
748*61046927SAndroid Build Coastguard Worker return typeless_orig == typeless_new;
749*61046927SAndroid Build Coastguard Worker
750*61046927SAndroid Build Coastguard Worker if (pdev->options3.CastingFullyTypedFormatSupported) {
751*61046927SAndroid Build Coastguard Worker enum pipe_format orig_pfmt = vk_format_to_pipe_format(orig_fmt);
752*61046927SAndroid Build Coastguard Worker enum pipe_format new_pfmt = vk_format_to_pipe_format(new_fmt);
753*61046927SAndroid Build Coastguard Worker
754*61046927SAndroid Build Coastguard Worker /* Types don't belong to the same group, they're incompatible. */
755*61046927SAndroid Build Coastguard Worker if (typeless_orig != typeless_new)
756*61046927SAndroid Build Coastguard Worker return false;
757*61046927SAndroid Build Coastguard Worker
758*61046927SAndroid Build Coastguard Worker /* FLOAT <-> non-FLOAT casting is disallowed. */
759*61046927SAndroid Build Coastguard Worker if (util_format_is_float(orig_pfmt) != util_format_is_float(new_pfmt))
760*61046927SAndroid Build Coastguard Worker return false;
761*61046927SAndroid Build Coastguard Worker
762*61046927SAndroid Build Coastguard Worker /* UNORM <-> SNORM casting is disallowed. */
763*61046927SAndroid Build Coastguard Worker bool orig_is_norm =
764*61046927SAndroid Build Coastguard Worker util_format_is_unorm(orig_pfmt) || util_format_is_snorm(orig_pfmt);
765*61046927SAndroid Build Coastguard Worker bool new_is_norm =
766*61046927SAndroid Build Coastguard Worker util_format_is_unorm(new_pfmt) || util_format_is_snorm(new_pfmt);
767*61046927SAndroid Build Coastguard Worker if (orig_is_norm && new_is_norm &&
768*61046927SAndroid Build Coastguard Worker util_format_is_unorm(orig_pfmt) != util_format_is_unorm(new_pfmt))
769*61046927SAndroid Build Coastguard Worker return false;
770*61046927SAndroid Build Coastguard Worker
771*61046927SAndroid Build Coastguard Worker return true;
772*61046927SAndroid Build Coastguard Worker }
773*61046927SAndroid Build Coastguard Worker
774*61046927SAndroid Build Coastguard Worker return false;
775*61046927SAndroid Build Coastguard Worker }
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateImage(VkDevice device,const VkImageCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImage * pImage)778*61046927SAndroid Build Coastguard Worker dzn_CreateImage(VkDevice device,
779*61046927SAndroid Build Coastguard Worker const VkImageCreateInfo *pCreateInfo,
780*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
781*61046927SAndroid Build Coastguard Worker VkImage *pImage)
782*61046927SAndroid Build Coastguard Worker {
783*61046927SAndroid Build Coastguard Worker return dzn_image_create(dzn_device_from_handle(device),
784*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator, pImage);
785*61046927SAndroid Build Coastguard Worker }
786*61046927SAndroid Build Coastguard Worker
787*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyImage(VkDevice device,VkImage image,const VkAllocationCallbacks * pAllocator)788*61046927SAndroid Build Coastguard Worker dzn_DestroyImage(VkDevice device, VkImage image,
789*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
790*61046927SAndroid Build Coastguard Worker {
791*61046927SAndroid Build Coastguard Worker dzn_image_destroy(dzn_image_from_handle(image), pAllocator);
792*61046927SAndroid Build Coastguard Worker }
793*61046927SAndroid Build Coastguard Worker
794*61046927SAndroid Build Coastguard Worker static struct dzn_image *
dzn_swapchain_get_image(struct dzn_device * device,VkSwapchainKHR swapchain,uint32_t index)795*61046927SAndroid Build Coastguard Worker dzn_swapchain_get_image(struct dzn_device *device,
796*61046927SAndroid Build Coastguard Worker VkSwapchainKHR swapchain,
797*61046927SAndroid Build Coastguard Worker uint32_t index)
798*61046927SAndroid Build Coastguard Worker {
799*61046927SAndroid Build Coastguard Worker uint32_t n_images = index + 1;
800*61046927SAndroid Build Coastguard Worker STACK_ARRAY(VkImage, images, n_images);
801*61046927SAndroid Build Coastguard Worker struct dzn_image *image = NULL;
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker VkResult result = wsi_common_get_images(swapchain, &n_images, images);
804*61046927SAndroid Build Coastguard Worker
805*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS || result == VK_INCOMPLETE)
806*61046927SAndroid Build Coastguard Worker image = dzn_image_from_handle(images[index]);
807*61046927SAndroid Build Coastguard Worker
808*61046927SAndroid Build Coastguard Worker STACK_ARRAY_FINISH(images);
809*61046927SAndroid Build Coastguard Worker return image;
810*61046927SAndroid Build Coastguard Worker }
811*61046927SAndroid Build Coastguard Worker
812*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_BindImageMemory2(VkDevice dev,uint32_t bindInfoCount,const VkBindImageMemoryInfo * pBindInfos)813*61046927SAndroid Build Coastguard Worker dzn_BindImageMemory2(VkDevice dev,
814*61046927SAndroid Build Coastguard Worker uint32_t bindInfoCount,
815*61046927SAndroid Build Coastguard Worker const VkBindImageMemoryInfo *pBindInfos)
816*61046927SAndroid Build Coastguard Worker {
817*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, dev);
818*61046927SAndroid Build Coastguard Worker
819*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < bindInfoCount; i++) {
820*61046927SAndroid Build Coastguard Worker const VkBindImageMemoryInfo *bind_info = &pBindInfos[i];
821*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device_memory, mem, bind_info->memory);
822*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_image, image, bind_info->image);
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker #ifdef DZN_USE_WSI_PLATFORM
825*61046927SAndroid Build Coastguard Worker const VkBindImageMemorySwapchainInfoKHR *swapchain_info =
826*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pBindInfos[i].pNext, BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR);
827*61046927SAndroid Build Coastguard Worker
828*61046927SAndroid Build Coastguard Worker if (swapchain_info && swapchain_info->swapchain != VK_NULL_HANDLE) {
829*61046927SAndroid Build Coastguard Worker struct dzn_image *swapchain_img =
830*61046927SAndroid Build Coastguard Worker dzn_image_from_handle(wsi_common_get_image(swapchain_info->swapchain, swapchain_info->imageIndex));
831*61046927SAndroid Build Coastguard Worker
832*61046927SAndroid Build Coastguard Worker mem = swapchain_img->mem;
833*61046927SAndroid Build Coastguard Worker }
834*61046927SAndroid Build Coastguard Worker #endif
835*61046927SAndroid Build Coastguard Worker
836*61046927SAndroid Build Coastguard Worker image->mem = mem;
837*61046927SAndroid Build Coastguard Worker
838*61046927SAndroid Build Coastguard Worker HRESULT hres = S_OK;
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker if (mem->dedicated_res) {
841*61046927SAndroid Build Coastguard Worker assert(pBindInfos[i].memoryOffset == 0);
842*61046927SAndroid Build Coastguard Worker image->res = mem->dedicated_res;
843*61046927SAndroid Build Coastguard Worker ID3D12Resource_AddRef(image->res);
844*61046927SAndroid Build Coastguard Worker } else if (device->dev10 && image->castable_format_count > 0) {
845*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC1 desc = {
846*61046927SAndroid Build Coastguard Worker .Dimension = image->desc.Dimension,
847*61046927SAndroid Build Coastguard Worker .Alignment = image->desc.Alignment,
848*61046927SAndroid Build Coastguard Worker .Width = image->desc.Width,
849*61046927SAndroid Build Coastguard Worker .Height = image->desc.Height,
850*61046927SAndroid Build Coastguard Worker .DepthOrArraySize = image->desc.DepthOrArraySize,
851*61046927SAndroid Build Coastguard Worker .MipLevels = image->desc.MipLevels,
852*61046927SAndroid Build Coastguard Worker .Format = image->desc.Format,
853*61046927SAndroid Build Coastguard Worker .SampleDesc = image->desc.SampleDesc,
854*61046927SAndroid Build Coastguard Worker .Layout = image->desc.Layout,
855*61046927SAndroid Build Coastguard Worker .Flags = image->desc.Flags | mem->res_flags,
856*61046927SAndroid Build Coastguard Worker };
857*61046927SAndroid Build Coastguard Worker
858*61046927SAndroid Build Coastguard Worker hres = ID3D12Device10_CreatePlacedResource2(device->dev10, mem->heap,
859*61046927SAndroid Build Coastguard Worker bind_info->memoryOffset,
860*61046927SAndroid Build Coastguard Worker &desc,
861*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT_COMMON,
862*61046927SAndroid Build Coastguard Worker NULL,
863*61046927SAndroid Build Coastguard Worker image->castable_format_count,
864*61046927SAndroid Build Coastguard Worker image->castable_formats,
865*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
866*61046927SAndroid Build Coastguard Worker (void **)&image->res);
867*61046927SAndroid Build Coastguard Worker } else {
868*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC desc = image->desc;
869*61046927SAndroid Build Coastguard Worker desc.Flags |= mem->res_flags;
870*61046927SAndroid Build Coastguard Worker hres = ID3D12Device1_CreatePlacedResource(device->dev, mem->heap,
871*61046927SAndroid Build Coastguard Worker bind_info->memoryOffset,
872*61046927SAndroid Build Coastguard Worker &desc,
873*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATE_COMMON,
874*61046927SAndroid Build Coastguard Worker NULL,
875*61046927SAndroid Build Coastguard Worker &IID_ID3D12Resource,
876*61046927SAndroid Build Coastguard Worker (void **)&image->res);
877*61046927SAndroid Build Coastguard Worker }
878*61046927SAndroid Build Coastguard Worker if (FAILED(hres))
879*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
880*61046927SAndroid Build Coastguard Worker }
881*61046927SAndroid Build Coastguard Worker
882*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
883*61046927SAndroid Build Coastguard Worker }
884*61046927SAndroid Build Coastguard Worker
885*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetImageMemoryRequirements2(VkDevice _device,const VkImageMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements)886*61046927SAndroid Build Coastguard Worker dzn_GetImageMemoryRequirements2(VkDevice _device,
887*61046927SAndroid Build Coastguard Worker const VkImageMemoryRequirementsInfo2 *pInfo,
888*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
889*61046927SAndroid Build Coastguard Worker {
890*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, _device);
891*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_image, image, pInfo->image);
892*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
893*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical, struct dzn_physical_device, vk);
894*61046927SAndroid Build Coastguard Worker
895*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(ext, pInfo->pNext) {
896*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
897*61046927SAndroid Build Coastguard Worker }
898*61046927SAndroid Build Coastguard Worker
899*61046927SAndroid Build Coastguard Worker vk_foreach_struct(ext, pMemoryRequirements->pNext) {
900*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
901*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
902*61046927SAndroid Build Coastguard Worker VkMemoryDedicatedRequirements *requirements =
903*61046927SAndroid Build Coastguard Worker (VkMemoryDedicatedRequirements *)ext;
904*61046927SAndroid Build Coastguard Worker requirements->requiresDedicatedAllocation = image->vk.external_handle_types != 0;
905*61046927SAndroid Build Coastguard Worker requirements->prefersDedicatedAllocation = requirements->requiresDedicatedAllocation ||
906*61046927SAndroid Build Coastguard Worker image->vk.tiling == VK_IMAGE_TILING_OPTIMAL;
907*61046927SAndroid Build Coastguard Worker break;
908*61046927SAndroid Build Coastguard Worker }
909*61046927SAndroid Build Coastguard Worker
910*61046927SAndroid Build Coastguard Worker default:
911*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
912*61046927SAndroid Build Coastguard Worker break;
913*61046927SAndroid Build Coastguard Worker }
914*61046927SAndroid Build Coastguard Worker }
915*61046927SAndroid Build Coastguard Worker
916*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_ALLOCATION_INFO info;
917*61046927SAndroid Build Coastguard Worker if (device->dev12 && image->castable_format_count > 0) {
918*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_DESC1 desc1;
919*61046927SAndroid Build Coastguard Worker memcpy(&desc1, &image->desc, sizeof(image->desc));
920*61046927SAndroid Build Coastguard Worker memset(&desc1.SamplerFeedbackMipRegion, 0, sizeof(desc1.SamplerFeedbackMipRegion));
921*61046927SAndroid Build Coastguard Worker info = dzn_ID3D12Device12_GetResourceAllocationInfo3(device->dev12, 0, 1, &desc1,
922*61046927SAndroid Build Coastguard Worker &image->castable_format_count,
923*61046927SAndroid Build Coastguard Worker (const DXGI_FORMAT *const *) &image->castable_formats,
924*61046927SAndroid Build Coastguard Worker NULL);
925*61046927SAndroid Build Coastguard Worker } else {
926*61046927SAndroid Build Coastguard Worker info = dzn_ID3D12Device4_GetResourceAllocationInfo(device->dev, 0, 1, &image->desc);
927*61046927SAndroid Build Coastguard Worker }
928*61046927SAndroid Build Coastguard Worker
929*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
930*61046927SAndroid Build Coastguard Worker .size = info.SizeInBytes,
931*61046927SAndroid Build Coastguard Worker .alignment = info.Alignment,
932*61046927SAndroid Build Coastguard Worker .memoryTypeBits =
933*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_mem_type_mask_for_resource(pdev, &image->desc,
934*61046927SAndroid Build Coastguard Worker image->vk.external_handle_types != 0),
935*61046927SAndroid Build Coastguard Worker };
936*61046927SAndroid Build Coastguard Worker
937*61046927SAndroid Build Coastguard Worker /*
938*61046927SAndroid Build Coastguard Worker * MSAA images need memory to be aligned on
939*61046927SAndroid Build Coastguard Worker * D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4MB), but the memory
940*61046927SAndroid Build Coastguard Worker * allocation function doesn't know what the memory will be used for,
941*61046927SAndroid Build Coastguard Worker * and forcing all allocations to be 4MB-aligned has a cost, so let's
942*61046927SAndroid Build Coastguard Worker * force MSAA resources to be at least 4MB, such that the allocation
943*61046927SAndroid Build Coastguard Worker * logic can consider sub-4MB allocations to not require this 4MB alignment.
944*61046927SAndroid Build Coastguard Worker */
945*61046927SAndroid Build Coastguard Worker if (image->vk.samples > 1 &&
946*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements.size < D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT)
947*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements.size = D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT;
948*61046927SAndroid Build Coastguard Worker }
949*61046927SAndroid Build Coastguard Worker
950*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_GetImageSubresourceLayout(VkDevice _device,VkImage _image,const VkImageSubresource * subresource,VkSubresourceLayout * layout)951*61046927SAndroid Build Coastguard Worker dzn_GetImageSubresourceLayout(VkDevice _device,
952*61046927SAndroid Build Coastguard Worker VkImage _image,
953*61046927SAndroid Build Coastguard Worker const VkImageSubresource *subresource,
954*61046927SAndroid Build Coastguard Worker VkSubresourceLayout *layout)
955*61046927SAndroid Build Coastguard Worker {
956*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_device, device, _device);
957*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_image, image, _image);
958*61046927SAndroid Build Coastguard Worker
959*61046927SAndroid Build Coastguard Worker if (image->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) {
960*61046927SAndroid Build Coastguard Worker assert(subresource->arrayLayer == 0);
961*61046927SAndroid Build Coastguard Worker assert(subresource->mipLevel == 0);
962*61046927SAndroid Build Coastguard Worker layout->offset = 0;
963*61046927SAndroid Build Coastguard Worker layout->rowPitch = image->linear.row_stride;
964*61046927SAndroid Build Coastguard Worker layout->depthPitch = 0;
965*61046927SAndroid Build Coastguard Worker layout->arrayPitch = 0;
966*61046927SAndroid Build Coastguard Worker layout->size = image->linear.size;
967*61046927SAndroid Build Coastguard Worker } else {
968*61046927SAndroid Build Coastguard Worker UINT subres_index =
969*61046927SAndroid Build Coastguard Worker dzn_image_get_subresource_index(image, subresource,
970*61046927SAndroid Build Coastguard Worker (VkImageAspectFlagBits)subresource->aspectMask);
971*61046927SAndroid Build Coastguard Worker D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint;
972*61046927SAndroid Build Coastguard Worker UINT num_rows;
973*61046927SAndroid Build Coastguard Worker UINT64 row_size, total_size;
974*61046927SAndroid Build Coastguard Worker ID3D12Device1_GetCopyableFootprints(device->dev, &image->desc,
975*61046927SAndroid Build Coastguard Worker subres_index, 1,
976*61046927SAndroid Build Coastguard Worker 0, // base-offset?
977*61046927SAndroid Build Coastguard Worker &footprint,
978*61046927SAndroid Build Coastguard Worker &num_rows, &row_size,
979*61046927SAndroid Build Coastguard Worker &total_size);
980*61046927SAndroid Build Coastguard Worker
981*61046927SAndroid Build Coastguard Worker layout->offset = footprint.Offset;
982*61046927SAndroid Build Coastguard Worker layout->rowPitch = footprint.Footprint.RowPitch;
983*61046927SAndroid Build Coastguard Worker layout->depthPitch = layout->rowPitch * footprint.Footprint.Height;
984*61046927SAndroid Build Coastguard Worker layout->arrayPitch = layout->depthPitch; // uuuh... why is this even here?
985*61046927SAndroid Build Coastguard Worker layout->size = total_size;
986*61046927SAndroid Build Coastguard Worker }
987*61046927SAndroid Build Coastguard Worker }
988*61046927SAndroid Build Coastguard Worker
989*61046927SAndroid Build Coastguard Worker static D3D12_SHADER_COMPONENT_MAPPING
translate_swizzle(VkComponentSwizzle in,uint32_t comp)990*61046927SAndroid Build Coastguard Worker translate_swizzle(VkComponentSwizzle in, uint32_t comp)
991*61046927SAndroid Build Coastguard Worker {
992*61046927SAndroid Build Coastguard Worker switch (in) {
993*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_IDENTITY:
994*61046927SAndroid Build Coastguard Worker return (D3D12_SHADER_COMPONENT_MAPPING)
995*61046927SAndroid Build Coastguard Worker (comp + D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0);
996*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_ZERO:
997*61046927SAndroid Build Coastguard Worker return D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0;
998*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_ONE:
999*61046927SAndroid Build Coastguard Worker return D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1;
1000*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_R:
1001*61046927SAndroid Build Coastguard Worker return D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0;
1002*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_G:
1003*61046927SAndroid Build Coastguard Worker return D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1;
1004*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_B:
1005*61046927SAndroid Build Coastguard Worker return D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2;
1006*61046927SAndroid Build Coastguard Worker case VK_COMPONENT_SWIZZLE_A:
1007*61046927SAndroid Build Coastguard Worker return D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3;
1008*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid swizzle");
1009*61046927SAndroid Build Coastguard Worker }
1010*61046927SAndroid Build Coastguard Worker }
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker static void
dzn_image_view_prepare_srv_desc(struct dzn_image_view * iview)1013*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_srv_desc(struct dzn_image_view *iview)
1014*61046927SAndroid Build Coastguard Worker {
1015*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
1016*61046927SAndroid Build Coastguard Worker container_of(iview->vk.base.device->physical, struct dzn_physical_device, vk);
1017*61046927SAndroid Build Coastguard Worker uint32_t plane_slice = (iview->vk.aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) ==
1018*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_STENCIL_BIT ? 1 : 0;
1019*61046927SAndroid Build Coastguard Worker bool ms = iview->vk.image->samples > 1;
1020*61046927SAndroid Build Coastguard Worker uint32_t layers_per_elem =
1021*61046927SAndroid Build Coastguard Worker (iview->vk.view_type == VK_IMAGE_VIEW_TYPE_CUBE ||
1022*61046927SAndroid Build Coastguard Worker iview->vk.view_type == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ?
1023*61046927SAndroid Build Coastguard Worker 6 : 1;
1024*61046927SAndroid Build Coastguard Worker bool from_3d_image = iview->vk.image->image_type == VK_IMAGE_TYPE_3D;
1025*61046927SAndroid Build Coastguard Worker bool use_array = iview->vk.base_array_layer > 0 ||
1026*61046927SAndroid Build Coastguard Worker (iview->vk.layer_count / layers_per_elem) > 1;
1027*61046927SAndroid Build Coastguard Worker
1028*61046927SAndroid Build Coastguard Worker iview->srv_desc = (D3D12_SHADER_RESOURCE_VIEW_DESC) {
1029*61046927SAndroid Build Coastguard Worker .Format =
1030*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, iview->vk.format,
1031*61046927SAndroid Build Coastguard Worker iview->vk.usage & ~VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1032*61046927SAndroid Build Coastguard Worker iview->vk.aspects),
1033*61046927SAndroid Build Coastguard Worker };
1034*61046927SAndroid Build Coastguard Worker
1035*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING swz[] = {
1036*61046927SAndroid Build Coastguard Worker translate_swizzle(iview->vk.swizzle.r, 0),
1037*61046927SAndroid Build Coastguard Worker translate_swizzle(iview->vk.swizzle.g, 1),
1038*61046927SAndroid Build Coastguard Worker translate_swizzle(iview->vk.swizzle.b, 2),
1039*61046927SAndroid Build Coastguard Worker translate_swizzle(iview->vk.swizzle.a, 3),
1040*61046927SAndroid Build Coastguard Worker };
1041*61046927SAndroid Build Coastguard Worker
1042*61046927SAndroid Build Coastguard Worker /* Swap components to fake B4G4R4A4 support. */
1043*61046927SAndroid Build Coastguard Worker if (iview->vk.format == VK_FORMAT_B4G4R4A4_UNORM_PACK16) {
1044*61046927SAndroid Build Coastguard Worker if (pdev->support_a4b4g4r4) {
1045*61046927SAndroid Build Coastguard Worker static const D3D12_SHADER_COMPONENT_MAPPING bgra4_remap[] = {
1046*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2,
1047*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1,
1048*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
1049*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3,
1050*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
1051*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1,
1052*61046927SAndroid Build Coastguard Worker };
1053*61046927SAndroid Build Coastguard Worker
1054*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(swz); i++)
1055*61046927SAndroid Build Coastguard Worker swz[i] = bgra4_remap[swz[i]];
1056*61046927SAndroid Build Coastguard Worker } else {
1057*61046927SAndroid Build Coastguard Worker static const D3D12_SHADER_COMPONENT_MAPPING bgra4_remap[] = {
1058*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1,
1059*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
1060*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3,
1061*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2,
1062*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
1063*61046927SAndroid Build Coastguard Worker D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1,
1064*61046927SAndroid Build Coastguard Worker };
1065*61046927SAndroid Build Coastguard Worker
1066*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(swz); i++)
1067*61046927SAndroid Build Coastguard Worker swz[i] = bgra4_remap[swz[i]];
1068*61046927SAndroid Build Coastguard Worker }
1069*61046927SAndroid Build Coastguard Worker } else if (iview->vk.aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
1070*61046927SAndroid Build Coastguard Worker /* D3D puts stencil in G, not R. Requests for R should be routed to G and vice versa. */
1071*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(swz); i++) {
1072*61046927SAndroid Build Coastguard Worker if (swz[i] == D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0)
1073*61046927SAndroid Build Coastguard Worker swz[i] = D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1;
1074*61046927SAndroid Build Coastguard Worker else if (swz[i] == D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1)
1075*61046927SAndroid Build Coastguard Worker swz[i] = D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0;
1076*61046927SAndroid Build Coastguard Worker }
1077*61046927SAndroid Build Coastguard Worker } else if (iview->vk.view_format == VK_FORMAT_BC1_RGB_SRGB_BLOCK ||
1078*61046927SAndroid Build Coastguard Worker iview->vk.view_format == VK_FORMAT_BC1_RGB_UNORM_BLOCK) {
1079*61046927SAndroid Build Coastguard Worker /* D3D has no opaque version of these; force alpha to 1 */
1080*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(swz); i++) {
1081*61046927SAndroid Build Coastguard Worker if (swz[i] == D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_3)
1082*61046927SAndroid Build Coastguard Worker swz[i] = D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1;
1083*61046927SAndroid Build Coastguard Worker }
1084*61046927SAndroid Build Coastguard Worker }
1085*61046927SAndroid Build Coastguard Worker
1086*61046927SAndroid Build Coastguard Worker iview->srv_desc.Shader4ComponentMapping =
1087*61046927SAndroid Build Coastguard Worker D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(swz[0], swz[1], swz[2], swz[3]);
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker switch (iview->vk.view_type) {
1090*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
1091*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D:
1092*61046927SAndroid Build Coastguard Worker if (use_array) {
1093*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY;
1094*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1DArray.MostDetailedMip = iview->vk.base_mip_level;
1095*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1DArray.MipLevels = iview->vk.level_count;
1096*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1DArray.FirstArraySlice = iview->vk.base_array_layer;
1097*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1DArray.ArraySize = iview->vk.layer_count;
1098*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1DArray.ResourceMinLODClamp = 0.0f;
1099*61046927SAndroid Build Coastguard Worker } else {
1100*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D;
1101*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1D.MostDetailedMip = iview->vk.base_mip_level;
1102*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1D.MipLevels = iview->vk.level_count;
1103*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture1D.ResourceMinLODClamp = 0.0f;
1104*61046927SAndroid Build Coastguard Worker }
1105*61046927SAndroid Build Coastguard Worker break;
1106*61046927SAndroid Build Coastguard Worker
1107*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
1108*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D:
1109*61046927SAndroid Build Coastguard Worker if (from_3d_image) {
1110*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;
1111*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture3D.MostDetailedMip = iview->vk.base_mip_level;
1112*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture3D.MipLevels = iview->vk.level_count;
1113*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture3D.ResourceMinLODClamp = 0.0f;
1114*61046927SAndroid Build Coastguard Worker } else if (use_array && ms) {
1115*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY;
1116*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DMSArray.FirstArraySlice = iview->vk.base_array_layer;
1117*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DMSArray.ArraySize = iview->vk.layer_count;
1118*61046927SAndroid Build Coastguard Worker } else if (use_array && !ms) {
1119*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
1120*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DArray.MostDetailedMip = iview->vk.base_mip_level;
1121*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DArray.MipLevels = iview->vk.level_count;
1122*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DArray.FirstArraySlice = iview->vk.base_array_layer;
1123*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DArray.ArraySize = iview->vk.layer_count;
1124*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DArray.PlaneSlice = plane_slice;
1125*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2DArray.ResourceMinLODClamp = 0.0f;
1126*61046927SAndroid Build Coastguard Worker } else if (!use_array && ms) {
1127*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS;
1128*61046927SAndroid Build Coastguard Worker } else {
1129*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
1130*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2D.MostDetailedMip = iview->vk.base_mip_level;
1131*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2D.MipLevels = iview->vk.level_count;
1132*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2D.PlaneSlice = plane_slice;
1133*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture2D.ResourceMinLODClamp = 0.0f;
1134*61046927SAndroid Build Coastguard Worker }
1135*61046927SAndroid Build Coastguard Worker break;
1136*61046927SAndroid Build Coastguard Worker
1137*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
1138*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE:
1139*61046927SAndroid Build Coastguard Worker if (use_array) {
1140*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY;
1141*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCubeArray.MostDetailedMip = iview->vk.base_mip_level;
1142*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCubeArray.MipLevels = iview->vk.level_count;
1143*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCubeArray.First2DArrayFace = iview->vk.base_array_layer;
1144*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCubeArray.NumCubes = iview->vk.layer_count / 6;
1145*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCubeArray.ResourceMinLODClamp = 0.0f;
1146*61046927SAndroid Build Coastguard Worker } else {
1147*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
1148*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCube.MostDetailedMip = iview->vk.base_mip_level;
1149*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCube.MipLevels = iview->vk.level_count;
1150*61046927SAndroid Build Coastguard Worker iview->srv_desc.TextureCube.ResourceMinLODClamp = 0.0f;
1151*61046927SAndroid Build Coastguard Worker }
1152*61046927SAndroid Build Coastguard Worker break;
1153*61046927SAndroid Build Coastguard Worker
1154*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_3D:
1155*61046927SAndroid Build Coastguard Worker iview->srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;
1156*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture3D.MostDetailedMip = iview->vk.base_mip_level;
1157*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture3D.MipLevels = iview->vk.level_count;
1158*61046927SAndroid Build Coastguard Worker iview->srv_desc.Texture3D.ResourceMinLODClamp = 0.0f;
1159*61046927SAndroid Build Coastguard Worker break;
1160*61046927SAndroid Build Coastguard Worker
1161*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid view type");
1162*61046927SAndroid Build Coastguard Worker }
1163*61046927SAndroid Build Coastguard Worker }
1164*61046927SAndroid Build Coastguard Worker
1165*61046927SAndroid Build Coastguard Worker static void
dzn_image_view_prepare_uav_desc(struct dzn_image_view * iview)1166*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_uav_desc(struct dzn_image_view *iview)
1167*61046927SAndroid Build Coastguard Worker {
1168*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
1169*61046927SAndroid Build Coastguard Worker container_of(iview->vk.base.device->physical, struct dzn_physical_device, vk);
1170*61046927SAndroid Build Coastguard Worker bool use_array = iview->vk.base_array_layer > 0 || iview->vk.layer_count > 1;
1171*61046927SAndroid Build Coastguard Worker
1172*61046927SAndroid Build Coastguard Worker assert(iview->vk.image->samples == 1);
1173*61046927SAndroid Build Coastguard Worker
1174*61046927SAndroid Build Coastguard Worker iview->uav_desc = (D3D12_UNORDERED_ACCESS_VIEW_DESC) {
1175*61046927SAndroid Build Coastguard Worker .Format =
1176*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, iview->vk.format,
1177*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_STORAGE_BIT,
1178*61046927SAndroid Build Coastguard Worker iview->vk.aspects),
1179*61046927SAndroid Build Coastguard Worker };
1180*61046927SAndroid Build Coastguard Worker
1181*61046927SAndroid Build Coastguard Worker switch (iview->vk.view_type) {
1182*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D:
1183*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
1184*61046927SAndroid Build Coastguard Worker if (use_array) {
1185*61046927SAndroid Build Coastguard Worker iview->uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1DARRAY;
1186*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture1DArray.MipSlice = iview->vk.base_mip_level;
1187*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture1DArray.FirstArraySlice = iview->vk.base_array_layer;
1188*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture1DArray.ArraySize = iview->vk.layer_count;
1189*61046927SAndroid Build Coastguard Worker } else {
1190*61046927SAndroid Build Coastguard Worker iview->uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D;
1191*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture1D.MipSlice = iview->vk.base_mip_level;
1192*61046927SAndroid Build Coastguard Worker }
1193*61046927SAndroid Build Coastguard Worker break;
1194*61046927SAndroid Build Coastguard Worker
1195*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D:
1196*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
1197*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE:
1198*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
1199*61046927SAndroid Build Coastguard Worker if (use_array) {
1200*61046927SAndroid Build Coastguard Worker iview->uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY;
1201*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture2DArray.PlaneSlice = 0;
1202*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture2DArray.MipSlice = iview->vk.base_mip_level;
1203*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture2DArray.FirstArraySlice = iview->vk.base_array_layer;
1204*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture2DArray.ArraySize = iview->vk.layer_count;
1205*61046927SAndroid Build Coastguard Worker } else {
1206*61046927SAndroid Build Coastguard Worker iview->uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
1207*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture2D.MipSlice = iview->vk.base_mip_level;
1208*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture2D.PlaneSlice = 0;
1209*61046927SAndroid Build Coastguard Worker }
1210*61046927SAndroid Build Coastguard Worker break;
1211*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_3D:
1212*61046927SAndroid Build Coastguard Worker iview->uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D;
1213*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture3D.MipSlice = iview->vk.base_mip_level;
1214*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture3D.FirstWSlice = 0;
1215*61046927SAndroid Build Coastguard Worker iview->uav_desc.Texture3D.WSize = iview->vk.extent.depth;
1216*61046927SAndroid Build Coastguard Worker break;
1217*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid type");
1218*61046927SAndroid Build Coastguard Worker }
1219*61046927SAndroid Build Coastguard Worker }
1220*61046927SAndroid Build Coastguard Worker
1221*61046927SAndroid Build Coastguard Worker static void
dzn_image_view_prepare_rtv_desc(struct dzn_image_view * iview)1222*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_rtv_desc(struct dzn_image_view *iview)
1223*61046927SAndroid Build Coastguard Worker {
1224*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
1225*61046927SAndroid Build Coastguard Worker container_of(iview->vk.base.device->physical, struct dzn_physical_device, vk);
1226*61046927SAndroid Build Coastguard Worker bool use_array = iview->vk.base_array_layer > 0 || iview->vk.layer_count > 1;
1227*61046927SAndroid Build Coastguard Worker bool from_3d_image = iview->vk.image->image_type == VK_IMAGE_TYPE_3D;
1228*61046927SAndroid Build Coastguard Worker bool ms = iview->vk.image->samples > 1;
1229*61046927SAndroid Build Coastguard Worker uint32_t plane_slice =
1230*61046927SAndroid Build Coastguard Worker (iview->vk.aspects & VK_IMAGE_ASPECT_PLANE_2_BIT) ? 2 :
1231*61046927SAndroid Build Coastguard Worker (iview->vk.aspects & VK_IMAGE_ASPECT_PLANE_1_BIT) ? 1 : 0;
1232*61046927SAndroid Build Coastguard Worker
1233*61046927SAndroid Build Coastguard Worker iview->rtv_desc = (D3D12_RENDER_TARGET_VIEW_DESC) {
1234*61046927SAndroid Build Coastguard Worker .Format =
1235*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, iview->vk.format,
1236*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
1237*61046927SAndroid Build Coastguard Worker iview->vk.aspects),
1238*61046927SAndroid Build Coastguard Worker };
1239*61046927SAndroid Build Coastguard Worker
1240*61046927SAndroid Build Coastguard Worker switch (iview->vk.view_type) {
1241*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D:
1242*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
1243*61046927SAndroid Build Coastguard Worker if (use_array) {
1244*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE1DARRAY;
1245*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture1DArray.MipSlice = iview->vk.base_mip_level;
1246*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture1DArray.FirstArraySlice = iview->vk.base_array_layer;
1247*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture1DArray.ArraySize = iview->vk.layer_count;
1248*61046927SAndroid Build Coastguard Worker } else {
1249*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE1D;
1250*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture1D.MipSlice = iview->vk.base_mip_level;
1251*61046927SAndroid Build Coastguard Worker }
1252*61046927SAndroid Build Coastguard Worker break;
1253*61046927SAndroid Build Coastguard Worker
1254*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D:
1255*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
1256*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE:
1257*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
1258*61046927SAndroid Build Coastguard Worker if (from_3d_image) {
1259*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
1260*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture3D.MipSlice = iview->vk.base_mip_level;
1261*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture3D.FirstWSlice = iview->vk.base_array_layer;
1262*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture3D.WSize = iview->vk.layer_count;
1263*61046927SAndroid Build Coastguard Worker } else if (use_array && ms) {
1264*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY;
1265*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2DMSArray.FirstArraySlice = iview->vk.base_array_layer;
1266*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2DMSArray.ArraySize = iview->vk.layer_count;
1267*61046927SAndroid Build Coastguard Worker } else if (use_array && !ms) {
1268*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
1269*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2DArray.MipSlice = iview->vk.base_mip_level;
1270*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2DArray.FirstArraySlice = iview->vk.base_array_layer;
1271*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2DArray.ArraySize = iview->vk.layer_count;
1272*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2DArray.PlaneSlice = plane_slice;
1273*61046927SAndroid Build Coastguard Worker } else if (!use_array && ms) {
1274*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS;
1275*61046927SAndroid Build Coastguard Worker } else {
1276*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
1277*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2D.MipSlice = iview->vk.base_mip_level;
1278*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture2D.PlaneSlice = plane_slice;
1279*61046927SAndroid Build Coastguard Worker }
1280*61046927SAndroid Build Coastguard Worker break;
1281*61046927SAndroid Build Coastguard Worker
1282*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_3D:
1283*61046927SAndroid Build Coastguard Worker iview->rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
1284*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture3D.MipSlice = iview->vk.base_mip_level;
1285*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture3D.FirstWSlice = 0;
1286*61046927SAndroid Build Coastguard Worker iview->rtv_desc.Texture3D.WSize = iview->vk.extent.depth;
1287*61046927SAndroid Build Coastguard Worker break;
1288*61046927SAndroid Build Coastguard Worker
1289*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid view type");
1290*61046927SAndroid Build Coastguard Worker }
1291*61046927SAndroid Build Coastguard Worker }
1292*61046927SAndroid Build Coastguard Worker
1293*61046927SAndroid Build Coastguard Worker static void
dzn_image_view_prepare_dsv_desc(struct dzn_image_view * iview)1294*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_dsv_desc(struct dzn_image_view *iview)
1295*61046927SAndroid Build Coastguard Worker {
1296*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
1297*61046927SAndroid Build Coastguard Worker container_of(iview->vk.base.device->physical, struct dzn_physical_device, vk);
1298*61046927SAndroid Build Coastguard Worker bool use_array = iview->vk.base_array_layer > 0 || iview->vk.layer_count > 1;
1299*61046927SAndroid Build Coastguard Worker bool ms = iview->vk.image->samples > 1;
1300*61046927SAndroid Build Coastguard Worker
1301*61046927SAndroid Build Coastguard Worker iview->dsv_desc = (D3D12_DEPTH_STENCIL_VIEW_DESC) {
1302*61046927SAndroid Build Coastguard Worker .Format =
1303*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(pdev, iview->vk.format,
1304*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1305*61046927SAndroid Build Coastguard Worker iview->vk.aspects),
1306*61046927SAndroid Build Coastguard Worker };
1307*61046927SAndroid Build Coastguard Worker
1308*61046927SAndroid Build Coastguard Worker switch (iview->vk.view_type) {
1309*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D:
1310*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
1311*61046927SAndroid Build Coastguard Worker if (use_array) {
1312*61046927SAndroid Build Coastguard Worker iview->dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE1DARRAY;
1313*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture1DArray.MipSlice = iview->vk.base_mip_level;
1314*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture1DArray.FirstArraySlice = iview->vk.base_array_layer;
1315*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture1DArray.ArraySize = iview->vk.layer_count;
1316*61046927SAndroid Build Coastguard Worker } else {
1317*61046927SAndroid Build Coastguard Worker iview->dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE1D;
1318*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture1D.MipSlice = iview->vk.base_mip_level;
1319*61046927SAndroid Build Coastguard Worker }
1320*61046927SAndroid Build Coastguard Worker break;
1321*61046927SAndroid Build Coastguard Worker
1322*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D:
1323*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
1324*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE:
1325*61046927SAndroid Build Coastguard Worker case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
1326*61046927SAndroid Build Coastguard Worker if (use_array && ms) {
1327*61046927SAndroid Build Coastguard Worker iview->dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY;
1328*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture2DMSArray.FirstArraySlice = iview->vk.base_array_layer;
1329*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture2DMSArray.ArraySize = iview->vk.layer_count;
1330*61046927SAndroid Build Coastguard Worker } else if (use_array && !ms) {
1331*61046927SAndroid Build Coastguard Worker iview->dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2DARRAY;
1332*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture2DArray.MipSlice = iview->vk.base_mip_level;
1333*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture2DArray.FirstArraySlice = iview->vk.base_array_layer;
1334*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture2DArray.ArraySize = iview->vk.layer_count;
1335*61046927SAndroid Build Coastguard Worker } else if (!use_array && ms) {
1336*61046927SAndroid Build Coastguard Worker iview->dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2DMS;
1337*61046927SAndroid Build Coastguard Worker } else {
1338*61046927SAndroid Build Coastguard Worker iview->dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
1339*61046927SAndroid Build Coastguard Worker iview->dsv_desc.Texture2D.MipSlice = iview->vk.base_mip_level;
1340*61046927SAndroid Build Coastguard Worker }
1341*61046927SAndroid Build Coastguard Worker break;
1342*61046927SAndroid Build Coastguard Worker
1343*61046927SAndroid Build Coastguard Worker default: unreachable("Invalid view type");
1344*61046927SAndroid Build Coastguard Worker }
1345*61046927SAndroid Build Coastguard Worker }
1346*61046927SAndroid Build Coastguard Worker
1347*61046927SAndroid Build Coastguard Worker void
dzn_image_view_finish(struct dzn_image_view * iview)1348*61046927SAndroid Build Coastguard Worker dzn_image_view_finish(struct dzn_image_view *iview)
1349*61046927SAndroid Build Coastguard Worker {
1350*61046927SAndroid Build Coastguard Worker vk_image_view_finish(&iview->vk);
1351*61046927SAndroid Build Coastguard Worker }
1352*61046927SAndroid Build Coastguard Worker
1353*61046927SAndroid Build Coastguard Worker void
dzn_image_view_init(struct dzn_device * device,struct dzn_image_view * iview,const VkImageViewCreateInfo * pCreateInfo)1354*61046927SAndroid Build Coastguard Worker dzn_image_view_init(struct dzn_device *device,
1355*61046927SAndroid Build Coastguard Worker struct dzn_image_view *iview,
1356*61046927SAndroid Build Coastguard Worker const VkImageViewCreateInfo *pCreateInfo)
1357*61046927SAndroid Build Coastguard Worker {
1358*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_image, image, pCreateInfo->image);
1359*61046927SAndroid Build Coastguard Worker
1360*61046927SAndroid Build Coastguard Worker const VkImageSubresourceRange *range = &pCreateInfo->subresourceRange;
1361*61046927SAndroid Build Coastguard Worker ASSERTED uint32_t layer_count = dzn_get_layer_count(image, range);
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker vk_image_view_init(&device->vk, &iview->vk, false, pCreateInfo);
1364*61046927SAndroid Build Coastguard Worker
1365*61046927SAndroid Build Coastguard Worker assert(layer_count > 0);
1366*61046927SAndroid Build Coastguard Worker assert(range->baseMipLevel < image->vk.mip_levels);
1367*61046927SAndroid Build Coastguard Worker
1368*61046927SAndroid Build Coastguard Worker /* View usage should be a subset of image usage */
1369*61046927SAndroid Build Coastguard Worker assert(iview->vk.usage & (VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
1370*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_SAMPLED_BIT |
1371*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_STORAGE_BIT |
1372*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
1373*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
1374*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT));
1375*61046927SAndroid Build Coastguard Worker
1376*61046927SAndroid Build Coastguard Worker /* We remove this bit on depth textures, so skip creating a UAV for those */
1377*61046927SAndroid Build Coastguard Worker if ((iview->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) &&
1378*61046927SAndroid Build Coastguard Worker !(image->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS))
1379*61046927SAndroid Build Coastguard Worker iview->vk.usage &= ~VK_IMAGE_USAGE_STORAGE_BIT;
1380*61046927SAndroid Build Coastguard Worker
1381*61046927SAndroid Build Coastguard Worker switch (image->vk.image_type) {
1382*61046927SAndroid Build Coastguard Worker default:
1383*61046927SAndroid Build Coastguard Worker unreachable("bad VkImageType");
1384*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_1D:
1385*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_2D:
1386*61046927SAndroid Build Coastguard Worker assert(range->baseArrayLayer + dzn_get_layer_count(image, range) - 1 <= image->vk.array_layers);
1387*61046927SAndroid Build Coastguard Worker break;
1388*61046927SAndroid Build Coastguard Worker case VK_IMAGE_TYPE_3D:
1389*61046927SAndroid Build Coastguard Worker assert(range->baseArrayLayer + dzn_get_layer_count(image, range) - 1
1390*61046927SAndroid Build Coastguard Worker <= u_minify(image->vk.extent.depth, range->baseMipLevel));
1391*61046927SAndroid Build Coastguard Worker break;
1392*61046927SAndroid Build Coastguard Worker }
1393*61046927SAndroid Build Coastguard Worker
1394*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_srv_desc(iview);
1395*61046927SAndroid Build Coastguard Worker
1396*61046927SAndroid Build Coastguard Worker if (iview->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT)
1397*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_uav_desc(iview);
1398*61046927SAndroid Build Coastguard Worker
1399*61046927SAndroid Build Coastguard Worker if (iview->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
1400*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_rtv_desc(iview);
1401*61046927SAndroid Build Coastguard Worker
1402*61046927SAndroid Build Coastguard Worker if (iview->vk.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
1403*61046927SAndroid Build Coastguard Worker dzn_image_view_prepare_dsv_desc(iview);
1404*61046927SAndroid Build Coastguard Worker }
1405*61046927SAndroid Build Coastguard Worker
1406*61046927SAndroid Build Coastguard Worker static void
dzn_image_view_destroy(struct dzn_image_view * iview,const VkAllocationCallbacks * pAllocator)1407*61046927SAndroid Build Coastguard Worker dzn_image_view_destroy(struct dzn_image_view *iview,
1408*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
1409*61046927SAndroid Build Coastguard Worker {
1410*61046927SAndroid Build Coastguard Worker if (!iview)
1411*61046927SAndroid Build Coastguard Worker return;
1412*61046927SAndroid Build Coastguard Worker
1413*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(iview->vk.base.device, struct dzn_device, vk);
1414*61046927SAndroid Build Coastguard Worker
1415*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, iview->srv_bindless_slot);
1416*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, iview->uav_bindless_slot);
1417*61046927SAndroid Build Coastguard Worker
1418*61046927SAndroid Build Coastguard Worker vk_image_view_finish(&iview->vk);
1419*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, iview);
1420*61046927SAndroid Build Coastguard Worker }
1421*61046927SAndroid Build Coastguard Worker
1422*61046927SAndroid Build Coastguard Worker static VkResult
dzn_image_view_create(struct dzn_device * device,const VkImageViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImageView * out)1423*61046927SAndroid Build Coastguard Worker dzn_image_view_create(struct dzn_device *device,
1424*61046927SAndroid Build Coastguard Worker const VkImageViewCreateInfo *pCreateInfo,
1425*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1426*61046927SAndroid Build Coastguard Worker VkImageView *out)
1427*61046927SAndroid Build Coastguard Worker {
1428*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_image, image, pCreateInfo->image);
1429*61046927SAndroid Build Coastguard Worker struct dzn_image_view *iview =
1430*61046927SAndroid Build Coastguard Worker vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*iview), 8,
1431*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
1432*61046927SAndroid Build Coastguard Worker if (!iview)
1433*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
1434*61046927SAndroid Build Coastguard Worker
1435*61046927SAndroid Build Coastguard Worker dzn_image_view_init(device, iview, pCreateInfo);
1436*61046927SAndroid Build Coastguard Worker
1437*61046927SAndroid Build Coastguard Worker iview->srv_bindless_slot = iview->uav_bindless_slot = -1;
1438*61046927SAndroid Build Coastguard Worker if (device->bindless) {
1439*61046927SAndroid Build Coastguard Worker if (!(image->desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE)) {
1440*61046927SAndroid Build Coastguard Worker iview->srv_bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
1441*61046927SAndroid Build Coastguard Worker if (iview->srv_bindless_slot < 0) {
1442*61046927SAndroid Build Coastguard Worker dzn_image_view_destroy(iview, pAllocator);
1443*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1444*61046927SAndroid Build Coastguard Worker }
1445*61046927SAndroid Build Coastguard Worker
1446*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_image_view_desc(device,
1447*61046927SAndroid Build Coastguard Worker &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
1448*61046927SAndroid Build Coastguard Worker iview->srv_bindless_slot,
1449*61046927SAndroid Build Coastguard Worker false, false,
1450*61046927SAndroid Build Coastguard Worker iview);
1451*61046927SAndroid Build Coastguard Worker }
1452*61046927SAndroid Build Coastguard Worker if (iview->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) {
1453*61046927SAndroid Build Coastguard Worker iview->uav_bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
1454*61046927SAndroid Build Coastguard Worker if (iview->uav_bindless_slot < 0) {
1455*61046927SAndroid Build Coastguard Worker dzn_image_view_destroy(iview, pAllocator);
1456*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1457*61046927SAndroid Build Coastguard Worker }
1458*61046927SAndroid Build Coastguard Worker
1459*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_image_view_desc(device,
1460*61046927SAndroid Build Coastguard Worker &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
1461*61046927SAndroid Build Coastguard Worker iview->uav_bindless_slot,
1462*61046927SAndroid Build Coastguard Worker true, true,
1463*61046927SAndroid Build Coastguard Worker iview);
1464*61046927SAndroid Build Coastguard Worker }
1465*61046927SAndroid Build Coastguard Worker }
1466*61046927SAndroid Build Coastguard Worker
1467*61046927SAndroid Build Coastguard Worker *out = dzn_image_view_to_handle(iview);
1468*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1469*61046927SAndroid Build Coastguard Worker }
1470*61046927SAndroid Build Coastguard Worker
1471*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateImageView(VkDevice device,const VkImageViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImageView * pView)1472*61046927SAndroid Build Coastguard Worker dzn_CreateImageView(VkDevice device,
1473*61046927SAndroid Build Coastguard Worker const VkImageViewCreateInfo *pCreateInfo,
1474*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1475*61046927SAndroid Build Coastguard Worker VkImageView *pView)
1476*61046927SAndroid Build Coastguard Worker {
1477*61046927SAndroid Build Coastguard Worker return dzn_image_view_create(dzn_device_from_handle(device), pCreateInfo,
1478*61046927SAndroid Build Coastguard Worker pAllocator, pView);
1479*61046927SAndroid Build Coastguard Worker }
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyImageView(VkDevice device,VkImageView imageView,const VkAllocationCallbacks * pAllocator)1482*61046927SAndroid Build Coastguard Worker dzn_DestroyImageView(VkDevice device,
1483*61046927SAndroid Build Coastguard Worker VkImageView imageView,
1484*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
1485*61046927SAndroid Build Coastguard Worker {
1486*61046927SAndroid Build Coastguard Worker dzn_image_view_destroy(dzn_image_view_from_handle(imageView), pAllocator);
1487*61046927SAndroid Build Coastguard Worker }
1488*61046927SAndroid Build Coastguard Worker
1489*61046927SAndroid Build Coastguard Worker static void
dzn_buffer_view_destroy(struct dzn_buffer_view * bview,const VkAllocationCallbacks * pAllocator)1490*61046927SAndroid Build Coastguard Worker dzn_buffer_view_destroy(struct dzn_buffer_view *bview,
1491*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
1492*61046927SAndroid Build Coastguard Worker {
1493*61046927SAndroid Build Coastguard Worker if (!bview)
1494*61046927SAndroid Build Coastguard Worker return;
1495*61046927SAndroid Build Coastguard Worker
1496*61046927SAndroid Build Coastguard Worker struct dzn_device *device = container_of(bview->base.device, struct dzn_device, vk);
1497*61046927SAndroid Build Coastguard Worker
1498*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, bview->srv_bindless_slot);
1499*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, bview->uav_bindless_slot);
1500*61046927SAndroid Build Coastguard Worker
1501*61046927SAndroid Build Coastguard Worker vk_object_base_finish(&bview->base);
1502*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, bview);
1503*61046927SAndroid Build Coastguard Worker }
1504*61046927SAndroid Build Coastguard Worker
1505*61046927SAndroid Build Coastguard Worker static VkResult
dzn_buffer_view_create(struct dzn_device * device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * out)1506*61046927SAndroid Build Coastguard Worker dzn_buffer_view_create(struct dzn_device *device,
1507*61046927SAndroid Build Coastguard Worker const VkBufferViewCreateInfo *pCreateInfo,
1508*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1509*61046927SAndroid Build Coastguard Worker VkBufferView *out)
1510*61046927SAndroid Build Coastguard Worker {
1511*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(dzn_buffer, buf, pCreateInfo->buffer);
1512*61046927SAndroid Build Coastguard Worker
1513*61046927SAndroid Build Coastguard Worker struct dzn_buffer_view *bview =
1514*61046927SAndroid Build Coastguard Worker vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*bview), 8,
1515*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
1516*61046927SAndroid Build Coastguard Worker if (!bview)
1517*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
1518*61046927SAndroid Build Coastguard Worker
1519*61046927SAndroid Build Coastguard Worker vk_object_base_init(&device->vk, &bview->base, VK_OBJECT_TYPE_BUFFER_VIEW);
1520*61046927SAndroid Build Coastguard Worker
1521*61046927SAndroid Build Coastguard Worker enum pipe_format pfmt = vk_format_to_pipe_format(pCreateInfo->format);
1522*61046927SAndroid Build Coastguard Worker unsigned blksz = util_format_get_blocksize(pfmt);
1523*61046927SAndroid Build Coastguard Worker VkDeviceSize size =
1524*61046927SAndroid Build Coastguard Worker pCreateInfo->range == VK_WHOLE_SIZE ?
1525*61046927SAndroid Build Coastguard Worker buf->size - pCreateInfo->offset : pCreateInfo->range;
1526*61046927SAndroid Build Coastguard Worker
1527*61046927SAndroid Build Coastguard Worker bview->buffer = buf;
1528*61046927SAndroid Build Coastguard Worker bview->srv_bindless_slot = bview->uav_bindless_slot = -1;
1529*61046927SAndroid Build Coastguard Worker if (buf->usage &
1530*61046927SAndroid Build Coastguard Worker (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
1531*61046927SAndroid Build Coastguard Worker VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) {
1532*61046927SAndroid Build Coastguard Worker bview->srv_desc = (D3D12_SHADER_RESOURCE_VIEW_DESC) {
1533*61046927SAndroid Build Coastguard Worker .Format = dzn_buffer_get_dxgi_format(pCreateInfo->format),
1534*61046927SAndroid Build Coastguard Worker .ViewDimension = D3D12_SRV_DIMENSION_BUFFER,
1535*61046927SAndroid Build Coastguard Worker .Shader4ComponentMapping =
1536*61046927SAndroid Build Coastguard Worker D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING,
1537*61046927SAndroid Build Coastguard Worker .Buffer = {
1538*61046927SAndroid Build Coastguard Worker .FirstElement = pCreateInfo->offset / blksz,
1539*61046927SAndroid Build Coastguard Worker .NumElements = (UINT)(size / blksz),
1540*61046927SAndroid Build Coastguard Worker .Flags = D3D12_BUFFER_SRV_FLAG_NONE,
1541*61046927SAndroid Build Coastguard Worker },
1542*61046927SAndroid Build Coastguard Worker };
1543*61046927SAndroid Build Coastguard Worker
1544*61046927SAndroid Build Coastguard Worker if (device->bindless) {
1545*61046927SAndroid Build Coastguard Worker bview->srv_bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
1546*61046927SAndroid Build Coastguard Worker if (bview->srv_bindless_slot < 0) {
1547*61046927SAndroid Build Coastguard Worker dzn_buffer_view_destroy(bview, pAllocator);
1548*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1549*61046927SAndroid Build Coastguard Worker }
1550*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_buffer_view_desc(device, &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
1551*61046927SAndroid Build Coastguard Worker bview->srv_bindless_slot, false, bview);
1552*61046927SAndroid Build Coastguard Worker }
1553*61046927SAndroid Build Coastguard Worker }
1554*61046927SAndroid Build Coastguard Worker
1555*61046927SAndroid Build Coastguard Worker if (buf->usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
1556*61046927SAndroid Build Coastguard Worker bview->uav_desc = (D3D12_UNORDERED_ACCESS_VIEW_DESC) {
1557*61046927SAndroid Build Coastguard Worker .Format = dzn_buffer_get_dxgi_format(pCreateInfo->format),
1558*61046927SAndroid Build Coastguard Worker .ViewDimension = D3D12_UAV_DIMENSION_BUFFER,
1559*61046927SAndroid Build Coastguard Worker .Buffer = {
1560*61046927SAndroid Build Coastguard Worker .FirstElement = pCreateInfo->offset / blksz,
1561*61046927SAndroid Build Coastguard Worker .NumElements = (UINT)(size / blksz),
1562*61046927SAndroid Build Coastguard Worker .Flags = D3D12_BUFFER_UAV_FLAG_NONE,
1563*61046927SAndroid Build Coastguard Worker },
1564*61046927SAndroid Build Coastguard Worker };
1565*61046927SAndroid Build Coastguard Worker
1566*61046927SAndroid Build Coastguard Worker if (device->bindless) {
1567*61046927SAndroid Build Coastguard Worker bview->uav_bindless_slot = dzn_device_descriptor_heap_alloc_slot(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
1568*61046927SAndroid Build Coastguard Worker if (bview->uav_bindless_slot < 0) {
1569*61046927SAndroid Build Coastguard Worker dzn_buffer_view_destroy(bview, pAllocator);
1570*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
1571*61046927SAndroid Build Coastguard Worker }
1572*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_buffer_view_desc(device, &device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
1573*61046927SAndroid Build Coastguard Worker bview->uav_bindless_slot, true, bview);
1574*61046927SAndroid Build Coastguard Worker }
1575*61046927SAndroid Build Coastguard Worker }
1576*61046927SAndroid Build Coastguard Worker
1577*61046927SAndroid Build Coastguard Worker *out = dzn_buffer_view_to_handle(bview);
1578*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1579*61046927SAndroid Build Coastguard Worker }
1580*61046927SAndroid Build Coastguard Worker
1581*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
dzn_CreateBufferView(VkDevice device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * pView)1582*61046927SAndroid Build Coastguard Worker dzn_CreateBufferView(VkDevice device,
1583*61046927SAndroid Build Coastguard Worker const VkBufferViewCreateInfo *pCreateInfo,
1584*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
1585*61046927SAndroid Build Coastguard Worker VkBufferView *pView)
1586*61046927SAndroid Build Coastguard Worker {
1587*61046927SAndroid Build Coastguard Worker return dzn_buffer_view_create(dzn_device_from_handle(device),
1588*61046927SAndroid Build Coastguard Worker pCreateInfo, pAllocator, pView);
1589*61046927SAndroid Build Coastguard Worker }
1590*61046927SAndroid Build Coastguard Worker
1591*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
dzn_DestroyBufferView(VkDevice device,VkBufferView bufferView,const VkAllocationCallbacks * pAllocator)1592*61046927SAndroid Build Coastguard Worker dzn_DestroyBufferView(VkDevice device,
1593*61046927SAndroid Build Coastguard Worker VkBufferView bufferView,
1594*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
1595*61046927SAndroid Build Coastguard Worker {
1596*61046927SAndroid Build Coastguard Worker dzn_buffer_view_destroy(dzn_buffer_view_from_handle(bufferView), pAllocator);
1597*61046927SAndroid Build Coastguard Worker }
1598