xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/d3d11/texture3d.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #define _CRT_SECURE_NO_WARNINGS
17*6467f958SSadaf Ebrahimi #include "harness.h"
18*6467f958SSadaf Ebrahimi 
19*6467f958SSadaf Ebrahimi Texture3DSize texture3DSizes[] =
20*6467f958SSadaf Ebrahimi {
21*6467f958SSadaf Ebrahimi     {
22*6467f958SSadaf Ebrahimi         4, // Width
23*6467f958SSadaf Ebrahimi         4, // Height
24*6467f958SSadaf Ebrahimi         4, // Depth
25*6467f958SSadaf Ebrahimi         1, // MipLevels
26*6467f958SSadaf Ebrahimi         1, // SubResourceCount
27*6467f958SSadaf Ebrahimi         {  // SubResources
28*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
29*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
30*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
31*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
32*6467f958SSadaf Ebrahimi         },
33*6467f958SSadaf Ebrahimi         0, // MiscFlags
34*6467f958SSadaf Ebrahimi     },
35*6467f958SSadaf Ebrahimi     {
36*6467f958SSadaf Ebrahimi         127, // Width
37*6467f958SSadaf Ebrahimi         55, // Height
38*6467f958SSadaf Ebrahimi         33, // Depth
39*6467f958SSadaf Ebrahimi         1, // MipLevels
40*6467f958SSadaf Ebrahimi         1, // SubResourceCount
41*6467f958SSadaf Ebrahimi         {  // SubResources
42*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
43*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
44*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
45*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
46*6467f958SSadaf Ebrahimi         },
47*6467f958SSadaf Ebrahimi         0, // MiscFlags
48*6467f958SSadaf Ebrahimi     },
49*6467f958SSadaf Ebrahimi     {
50*6467f958SSadaf Ebrahimi         128, // Width
51*6467f958SSadaf Ebrahimi         256, // Height
52*6467f958SSadaf Ebrahimi         64, // Depth
53*6467f958SSadaf Ebrahimi         4, // MipLevels
54*6467f958SSadaf Ebrahimi         3, // SubResourceCount
55*6467f958SSadaf Ebrahimi         {  // SubResources
56*6467f958SSadaf Ebrahimi             { 2 }, // MipLevel
57*6467f958SSadaf Ebrahimi             { 1 }, // MipLevel
58*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
59*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
60*6467f958SSadaf Ebrahimi         },
61*6467f958SSadaf Ebrahimi         0, // MiscFlags
62*6467f958SSadaf Ebrahimi     },
63*6467f958SSadaf Ebrahimi     {
64*6467f958SSadaf Ebrahimi         512, // Width
65*6467f958SSadaf Ebrahimi          64, // Height
66*6467f958SSadaf Ebrahimi          32, // Depth
67*6467f958SSadaf Ebrahimi         3, // MipLevels
68*6467f958SSadaf Ebrahimi         1, // SubResourceCount
69*6467f958SSadaf Ebrahimi         {  // SubResources
70*6467f958SSadaf Ebrahimi             { 2 }, // MipLevel
71*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
72*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
73*6467f958SSadaf Ebrahimi             { 0 }, // MipLevel
74*6467f958SSadaf Ebrahimi         },
75*6467f958SSadaf Ebrahimi         0, // MiscFlags
76*6467f958SSadaf Ebrahimi     },
77*6467f958SSadaf Ebrahimi };
78*6467f958SSadaf Ebrahimi UINT texture3DSizeCount = sizeof(texture3DSizes)/sizeof(texture3DSizes[0]);
79*6467f958SSadaf Ebrahimi 
80*6467f958SSadaf Ebrahimi const char *
81*6467f958SSadaf Ebrahimi texture3DPatterns[2][2][2] =
82*6467f958SSadaf Ebrahimi {
83*6467f958SSadaf Ebrahimi     {
84*6467f958SSadaf Ebrahimi         {"PlaceTheCasseroleDis", "hInAColdOvenPlaceACh"},
85*6467f958SSadaf Ebrahimi         {"airFacingTheOvenAndS", "itInItForeverThinkAb"},
86*6467f958SSadaf Ebrahimi     },
87*6467f958SSadaf Ebrahimi     {
88*6467f958SSadaf Ebrahimi         {"outHowHungryYouAreWh", "enNightFallsDoNotTur"},
89*6467f958SSadaf Ebrahimi         {"nOnTheLightMyEyeBeca", "meInflamedIHateCamus"},
90*6467f958SSadaf Ebrahimi     },
91*6467f958SSadaf Ebrahimi };
92*6467f958SSadaf Ebrahimi 
SubTestTexture3D(cl_context context,cl_command_queue command_queue,ID3D11Device * pDevice,ID3D11DeviceContext * pDC,const TextureFormat * format,const Texture3DSize * size)93*6467f958SSadaf Ebrahimi void SubTestTexture3D(
94*6467f958SSadaf Ebrahimi     cl_context context,
95*6467f958SSadaf Ebrahimi     cl_command_queue command_queue,
96*6467f958SSadaf Ebrahimi     ID3D11Device* pDevice,
97*6467f958SSadaf Ebrahimi     ID3D11DeviceContext* pDC,
98*6467f958SSadaf Ebrahimi     const TextureFormat* format,
99*6467f958SSadaf Ebrahimi     const Texture3DSize* size)
100*6467f958SSadaf Ebrahimi {
101*6467f958SSadaf Ebrahimi     ID3D11Texture3D* pTexture = NULL;
102*6467f958SSadaf Ebrahimi     HRESULT hr = S_OK;
103*6467f958SSadaf Ebrahimi 
104*6467f958SSadaf Ebrahimi     cl_int result = CL_SUCCESS;
105*6467f958SSadaf Ebrahimi 
106*6467f958SSadaf Ebrahimi     HarnessD3D11_TestBegin("3D Texture: Format=%s, Width=%d, Height=%d, Depth=%d, MipLevels=%d",
107*6467f958SSadaf Ebrahimi         format->name_format,
108*6467f958SSadaf Ebrahimi         size->Width,
109*6467f958SSadaf Ebrahimi         size->Height,
110*6467f958SSadaf Ebrahimi         size->Depth,
111*6467f958SSadaf Ebrahimi         size->MipLevels);
112*6467f958SSadaf Ebrahimi 
113*6467f958SSadaf Ebrahimi     struct
114*6467f958SSadaf Ebrahimi     {
115*6467f958SSadaf Ebrahimi         cl_mem mem;
116*6467f958SSadaf Ebrahimi         UINT subResource;
117*6467f958SSadaf Ebrahimi         UINT width;
118*6467f958SSadaf Ebrahimi         UINT height;
119*6467f958SSadaf Ebrahimi         UINT depth;
120*6467f958SSadaf Ebrahimi     }
121*6467f958SSadaf Ebrahimi     subResourceInfo[4];
122*6467f958SSadaf Ebrahimi 
123*6467f958SSadaf Ebrahimi     // create the D3D11 resources
124*6467f958SSadaf Ebrahimi     {
125*6467f958SSadaf Ebrahimi         D3D11_TEXTURE3D_DESC desc;
126*6467f958SSadaf Ebrahimi         memset(&desc, 0, sizeof(desc) );
127*6467f958SSadaf Ebrahimi         desc.Width      = size->Width;
128*6467f958SSadaf Ebrahimi         desc.Height     = size->Height;
129*6467f958SSadaf Ebrahimi         desc.Depth      = size->Depth;
130*6467f958SSadaf Ebrahimi         desc.MipLevels  = size->MipLevels;
131*6467f958SSadaf Ebrahimi         desc.Format     = format->format;
132*6467f958SSadaf Ebrahimi         desc.Usage = D3D11_USAGE_DEFAULT;
133*6467f958SSadaf Ebrahimi         desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
134*6467f958SSadaf Ebrahimi         desc.CPUAccessFlags = 0;
135*6467f958SSadaf Ebrahimi         desc.MiscFlags = 0;
136*6467f958SSadaf Ebrahimi 
137*6467f958SSadaf Ebrahimi         hr = pDevice->CreateTexture3D(&desc, NULL, &pTexture);
138*6467f958SSadaf Ebrahimi         TestRequire(SUCCEEDED(hr), "CreateTexture3D failed.");
139*6467f958SSadaf Ebrahimi     }
140*6467f958SSadaf Ebrahimi 
141*6467f958SSadaf Ebrahimi     // initialize some useful variables
142*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
143*6467f958SSadaf Ebrahimi     {
144*6467f958SSadaf Ebrahimi         // compute the expected values for the subresource
145*6467f958SSadaf Ebrahimi         subResourceInfo[i].subResource = size->subResources[i].MipLevel;
146*6467f958SSadaf Ebrahimi         subResourceInfo[i].width = size->Width;
147*6467f958SSadaf Ebrahimi         subResourceInfo[i].height = size->Height;
148*6467f958SSadaf Ebrahimi         subResourceInfo[i].depth = size->Depth;
149*6467f958SSadaf Ebrahimi         for (UINT j = 0; j < size->subResources[i].MipLevel; ++j) {
150*6467f958SSadaf Ebrahimi             subResourceInfo[i].width /= 2;
151*6467f958SSadaf Ebrahimi             subResourceInfo[i].height /= 2;
152*6467f958SSadaf Ebrahimi             subResourceInfo[i].depth /= 2;
153*6467f958SSadaf Ebrahimi         }
154*6467f958SSadaf Ebrahimi         subResourceInfo[i].mem = NULL;
155*6467f958SSadaf Ebrahimi     }
156*6467f958SSadaf Ebrahimi 
157*6467f958SSadaf Ebrahimi     // copy a pattern into the corners of the image, coordinates
158*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
159*6467f958SSadaf Ebrahimi     for (UINT x = 0; x < 2; ++x)
160*6467f958SSadaf Ebrahimi     for (UINT y = 0; y < 2; ++y)
161*6467f958SSadaf Ebrahimi     for (UINT z = 0; z < 2; ++z)
162*6467f958SSadaf Ebrahimi     {
163*6467f958SSadaf Ebrahimi         // create the staging buffer
164*6467f958SSadaf Ebrahimi         ID3D11Texture3D* pStagingBuffer = NULL;
165*6467f958SSadaf Ebrahimi         {
166*6467f958SSadaf Ebrahimi             D3D11_TEXTURE3D_DESC desc = {0};
167*6467f958SSadaf Ebrahimi             desc.Width      = 1;
168*6467f958SSadaf Ebrahimi             desc.Height     = 1;
169*6467f958SSadaf Ebrahimi             desc.Depth      = 1;
170*6467f958SSadaf Ebrahimi             desc.MipLevels  = 1;
171*6467f958SSadaf Ebrahimi             desc.Format     = format->format;
172*6467f958SSadaf Ebrahimi             desc.Usage = D3D11_USAGE_STAGING;
173*6467f958SSadaf Ebrahimi             desc.BindFlags = 0;
174*6467f958SSadaf Ebrahimi             desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
175*6467f958SSadaf Ebrahimi             desc.MiscFlags = 0;
176*6467f958SSadaf Ebrahimi             hr = pDevice->CreateTexture3D(&desc, NULL, &pStagingBuffer);
177*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "CreateTexture3D failed.");
178*6467f958SSadaf Ebrahimi         }
179*6467f958SSadaf Ebrahimi 
180*6467f958SSadaf Ebrahimi         // write the data to the staging buffer
181*6467f958SSadaf Ebrahimi         {
182*6467f958SSadaf Ebrahimi             D3D11_MAPPED_SUBRESOURCE mappedTexture;
183*6467f958SSadaf Ebrahimi             hr = pDC->Map(
184*6467f958SSadaf Ebrahimi                 pStagingBuffer,
185*6467f958SSadaf Ebrahimi                 0,
186*6467f958SSadaf Ebrahimi                 D3D11_MAP_READ_WRITE,
187*6467f958SSadaf Ebrahimi                 0,
188*6467f958SSadaf Ebrahimi                 &mappedTexture);
189*6467f958SSadaf Ebrahimi             memcpy(mappedTexture.pData, texture3DPatterns[x][y][z], format->bytesPerPixel);
190*6467f958SSadaf Ebrahimi             pDC->Unmap(pStagingBuffer, 0);
191*6467f958SSadaf Ebrahimi         }
192*6467f958SSadaf Ebrahimi 
193*6467f958SSadaf Ebrahimi         // copy the data to to the texture
194*6467f958SSadaf Ebrahimi         {
195*6467f958SSadaf Ebrahimi             D3D11_BOX box = {0};
196*6467f958SSadaf Ebrahimi             box.front   = 0; box.back    = 1;
197*6467f958SSadaf Ebrahimi             box.top     = 0; box.bottom  = 1;
198*6467f958SSadaf Ebrahimi             box.left    = 0; box.right   = 1;
199*6467f958SSadaf Ebrahimi             pDC->CopySubresourceRegion(
200*6467f958SSadaf Ebrahimi                 pTexture,
201*6467f958SSadaf Ebrahimi                 subResourceInfo[i].subResource,
202*6467f958SSadaf Ebrahimi                 x ? subResourceInfo[i].width  - 1 : 0,
203*6467f958SSadaf Ebrahimi                 y ? subResourceInfo[i].height - 1 : 0,
204*6467f958SSadaf Ebrahimi                 z ? subResourceInfo[i].depth  - 1 : 0,
205*6467f958SSadaf Ebrahimi                 pStagingBuffer,
206*6467f958SSadaf Ebrahimi                 0,
207*6467f958SSadaf Ebrahimi                 &box);
208*6467f958SSadaf Ebrahimi         }
209*6467f958SSadaf Ebrahimi 
210*6467f958SSadaf Ebrahimi         pStagingBuffer->Release();
211*6467f958SSadaf Ebrahimi     }
212*6467f958SSadaf Ebrahimi 
213*6467f958SSadaf Ebrahimi     // create the cl_mem objects for the resources and verify its sanity
214*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
215*6467f958SSadaf Ebrahimi     {
216*6467f958SSadaf Ebrahimi         // create a cl_mem for the resource
217*6467f958SSadaf Ebrahimi         subResourceInfo[i].mem = clCreateFromD3D11Texture3DKHR(
218*6467f958SSadaf Ebrahimi             context,
219*6467f958SSadaf Ebrahimi             0,
220*6467f958SSadaf Ebrahimi             pTexture,
221*6467f958SSadaf Ebrahimi             subResourceInfo[i].subResource,
222*6467f958SSadaf Ebrahimi             &result);
223*6467f958SSadaf Ebrahimi         if (CL_IMAGE_FORMAT_NOT_SUPPORTED == result)
224*6467f958SSadaf Ebrahimi         {
225*6467f958SSadaf Ebrahimi             goto Cleanup;
226*6467f958SSadaf Ebrahimi         }
227*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clCreateFromD3D11Texture3DKHR failed");
228*6467f958SSadaf Ebrahimi 
229*6467f958SSadaf Ebrahimi         // query resource pointer and verify
230*6467f958SSadaf Ebrahimi         ID3D11Resource* clResource = NULL;
231*6467f958SSadaf Ebrahimi         result = clGetMemObjectInfo(
232*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
233*6467f958SSadaf Ebrahimi             CL_MEM_D3D11_RESOURCE_KHR,
234*6467f958SSadaf Ebrahimi             sizeof(clResource),
235*6467f958SSadaf Ebrahimi             &clResource,
236*6467f958SSadaf Ebrahimi             NULL);
237*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetMemObjectInfo for CL_MEM_D3D11_RESOURCE_KHR failed.");
238*6467f958SSadaf Ebrahimi         TestRequire(clResource == pTexture, "clGetMemObjectInfo for CL_MEM_D3D11_RESOURCE_KHR returned incorrect value.");
239*6467f958SSadaf Ebrahimi 
240*6467f958SSadaf Ebrahimi         // query subresource and verify
241*6467f958SSadaf Ebrahimi         UINT clSubResource;
242*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
243*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
244*6467f958SSadaf Ebrahimi             CL_IMAGE_D3D11_SUBRESOURCE_KHR,
245*6467f958SSadaf Ebrahimi             sizeof(clSubResource),
246*6467f958SSadaf Ebrahimi             &clSubResource,
247*6467f958SSadaf Ebrahimi             NULL);
248*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_D3D11_SUBRESOURCE_KHR failed");
249*6467f958SSadaf Ebrahimi         TestRequire(clSubResource == subResourceInfo[i].subResource, "clGetImageInfo for CL_IMAGE_D3D11_SUBRESOURCE_KHR returned incorrect value.");
250*6467f958SSadaf Ebrahimi 
251*6467f958SSadaf Ebrahimi         // query format and verify
252*6467f958SSadaf Ebrahimi         cl_image_format clFormat;
253*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
254*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
255*6467f958SSadaf Ebrahimi             CL_IMAGE_FORMAT,
256*6467f958SSadaf Ebrahimi             sizeof(clFormat),
257*6467f958SSadaf Ebrahimi             &clFormat,
258*6467f958SSadaf Ebrahimi             NULL);
259*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_FORMAT failed");
260*6467f958SSadaf Ebrahimi         TestRequire(clFormat.image_channel_order == format->channel_order, "clGetImageInfo for CL_IMAGE_FORMAT returned incorrect channel order.");
261*6467f958SSadaf Ebrahimi         TestRequire(clFormat.image_channel_data_type == format->channel_type, "clGetImageInfo for CL_IMAGE_FORMAT returned incorrect channel data type.");
262*6467f958SSadaf Ebrahimi 
263*6467f958SSadaf Ebrahimi         // query width
264*6467f958SSadaf Ebrahimi         size_t width;
265*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
266*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
267*6467f958SSadaf Ebrahimi             CL_IMAGE_WIDTH,
268*6467f958SSadaf Ebrahimi             sizeof(width),
269*6467f958SSadaf Ebrahimi             &width,
270*6467f958SSadaf Ebrahimi             NULL);
271*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_WIDTH failed");
272*6467f958SSadaf Ebrahimi         TestRequire(width == subResourceInfo[i].width, "clGetImageInfo for CL_IMAGE_HEIGHT returned incorrect value.");
273*6467f958SSadaf Ebrahimi 
274*6467f958SSadaf Ebrahimi         // query height
275*6467f958SSadaf Ebrahimi         size_t height;
276*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
277*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
278*6467f958SSadaf Ebrahimi             CL_IMAGE_HEIGHT,
279*6467f958SSadaf Ebrahimi             sizeof(height),
280*6467f958SSadaf Ebrahimi             &height,
281*6467f958SSadaf Ebrahimi             NULL);
282*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_HEIGHT failed");
283*6467f958SSadaf Ebrahimi         TestRequire(height == subResourceInfo[i].height, "clGetImageInfo for CL_IMAGE_HEIGHT returned incorrect value.");
284*6467f958SSadaf Ebrahimi 
285*6467f958SSadaf Ebrahimi         // query depth
286*6467f958SSadaf Ebrahimi         size_t depth;
287*6467f958SSadaf Ebrahimi         result = clGetImageInfo(
288*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
289*6467f958SSadaf Ebrahimi             CL_IMAGE_DEPTH,
290*6467f958SSadaf Ebrahimi             sizeof(depth),
291*6467f958SSadaf Ebrahimi             &depth,
292*6467f958SSadaf Ebrahimi             NULL);
293*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clGetImageInfo for CL_IMAGE_DEPTH failed");
294*6467f958SSadaf Ebrahimi         TestRequire(depth == subResourceInfo[i].depth, "clGetImageInfo for CL_IMAGE_DEPTH returned incorrect value.");
295*6467f958SSadaf Ebrahimi 
296*6467f958SSadaf Ebrahimi     }
297*6467f958SSadaf Ebrahimi 
298*6467f958SSadaf Ebrahimi     // acquire the resources for OpenCL
299*6467f958SSadaf Ebrahimi     {
300*6467f958SSadaf Ebrahimi         cl_mem memToAcquire[MAX_REGISTERED_SUBRESOURCES];
301*6467f958SSadaf Ebrahimi 
302*6467f958SSadaf Ebrahimi         // cut the registered sub-resources into two sets and send the acquire calls for them separately
303*6467f958SSadaf Ebrahimi         for(UINT i = 0; i < size->SubResourceCount; ++i)
304*6467f958SSadaf Ebrahimi         {
305*6467f958SSadaf Ebrahimi             memToAcquire[i] = subResourceInfo[i].mem;
306*6467f958SSadaf Ebrahimi         }
307*6467f958SSadaf Ebrahimi 
308*6467f958SSadaf Ebrahimi         // do the acquire
309*6467f958SSadaf Ebrahimi         result = clEnqueueAcquireD3D11ObjectsKHR(
310*6467f958SSadaf Ebrahimi             command_queue,
311*6467f958SSadaf Ebrahimi             size->SubResourceCount,
312*6467f958SSadaf Ebrahimi             memToAcquire,
313*6467f958SSadaf Ebrahimi             0,
314*6467f958SSadaf Ebrahimi             NULL,
315*6467f958SSadaf Ebrahimi             NULL);
316*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clEnqueueAcquireD3D11ObjectsKHR failed.");
317*6467f958SSadaf Ebrahimi     }
318*6467f958SSadaf Ebrahimi 
319*6467f958SSadaf Ebrahimi     // download the data using OpenCL & compare with the expected results
320*6467f958SSadaf Ebrahimi     // copy the corners of the image into the image
321*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
322*6467f958SSadaf Ebrahimi     for (UINT x = 0; x < 2; ++x)
323*6467f958SSadaf Ebrahimi     for (UINT y = 0; y < 2; ++y)
324*6467f958SSadaf Ebrahimi     for (UINT z = 0; z < 2; ++z)
325*6467f958SSadaf Ebrahimi     {
326*6467f958SSadaf Ebrahimi         if (x == y && y == z && 0)
327*6467f958SSadaf Ebrahimi         {
328*6467f958SSadaf Ebrahimi             continue;
329*6467f958SSadaf Ebrahimi         }
330*6467f958SSadaf Ebrahimi         size_t src[3] =
331*6467f958SSadaf Ebrahimi         {
332*6467f958SSadaf Ebrahimi             x ? subResourceInfo[i].width  - 1 : 0,
333*6467f958SSadaf Ebrahimi             y ? subResourceInfo[i].height - 1 : 0,
334*6467f958SSadaf Ebrahimi             z ? subResourceInfo[i].depth  - 1 : 0,
335*6467f958SSadaf Ebrahimi         };
336*6467f958SSadaf Ebrahimi         size_t dst[3] =
337*6467f958SSadaf Ebrahimi         {
338*6467f958SSadaf Ebrahimi             x ? subResourceInfo[i].width  - 2 : 1,
339*6467f958SSadaf Ebrahimi             y ? subResourceInfo[i].height - 2 : 1,
340*6467f958SSadaf Ebrahimi             z ? subResourceInfo[i].depth  - 2 : 1,
341*6467f958SSadaf Ebrahimi         };
342*6467f958SSadaf Ebrahimi         size_t region[3] =
343*6467f958SSadaf Ebrahimi         {
344*6467f958SSadaf Ebrahimi             1,
345*6467f958SSadaf Ebrahimi             1,
346*6467f958SSadaf Ebrahimi             1,
347*6467f958SSadaf Ebrahimi         };
348*6467f958SSadaf Ebrahimi         result = clEnqueueCopyImage(
349*6467f958SSadaf Ebrahimi             command_queue,
350*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
351*6467f958SSadaf Ebrahimi             subResourceInfo[i].mem,
352*6467f958SSadaf Ebrahimi             src,
353*6467f958SSadaf Ebrahimi             dst,
354*6467f958SSadaf Ebrahimi             region,
355*6467f958SSadaf Ebrahimi             0,
356*6467f958SSadaf Ebrahimi             NULL,
357*6467f958SSadaf Ebrahimi             NULL);
358*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clEnqueueCopyImage failed.");
359*6467f958SSadaf Ebrahimi     }
360*6467f958SSadaf Ebrahimi 
361*6467f958SSadaf Ebrahimi     // release the resource from OpenCL
362*6467f958SSadaf Ebrahimi     {
363*6467f958SSadaf Ebrahimi         cl_mem memToAcquire[MAX_REGISTERED_SUBRESOURCES];
364*6467f958SSadaf Ebrahimi         for(UINT i = 0; i < size->SubResourceCount; ++i)
365*6467f958SSadaf Ebrahimi         {
366*6467f958SSadaf Ebrahimi             memToAcquire[i] = subResourceInfo[i].mem;
367*6467f958SSadaf Ebrahimi         }
368*6467f958SSadaf Ebrahimi 
369*6467f958SSadaf Ebrahimi         // do the release
370*6467f958SSadaf Ebrahimi         result = clEnqueueReleaseD3D11ObjectsKHR(
371*6467f958SSadaf Ebrahimi             command_queue,
372*6467f958SSadaf Ebrahimi             size->SubResourceCount,
373*6467f958SSadaf Ebrahimi             memToAcquire,
374*6467f958SSadaf Ebrahimi             0,
375*6467f958SSadaf Ebrahimi             NULL,
376*6467f958SSadaf Ebrahimi             NULL);
377*6467f958SSadaf Ebrahimi         TestRequire(result == CL_SUCCESS, "clEnqueueReleaseD3D11ObjectsKHR failed.");
378*6467f958SSadaf Ebrahimi     }
379*6467f958SSadaf Ebrahimi 
380*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
381*6467f958SSadaf Ebrahimi     for (UINT x = 0; x < 2; ++x)
382*6467f958SSadaf Ebrahimi     for (UINT y = 0; y < 2; ++y)
383*6467f958SSadaf Ebrahimi     for (UINT z = 0; z < 2; ++z)
384*6467f958SSadaf Ebrahimi     {
385*6467f958SSadaf Ebrahimi         // create the staging buffer
386*6467f958SSadaf Ebrahimi         ID3D11Texture3D* pStagingBuffer = NULL;
387*6467f958SSadaf Ebrahimi         {
388*6467f958SSadaf Ebrahimi             D3D11_TEXTURE3D_DESC desc = {0};
389*6467f958SSadaf Ebrahimi             desc.Width      = 1;
390*6467f958SSadaf Ebrahimi             desc.Height     = 1;
391*6467f958SSadaf Ebrahimi             desc.Depth      = 1;
392*6467f958SSadaf Ebrahimi             desc.MipLevels  = 1;
393*6467f958SSadaf Ebrahimi             desc.Format     = format->format;
394*6467f958SSadaf Ebrahimi             desc.Usage = D3D11_USAGE_STAGING;
395*6467f958SSadaf Ebrahimi             desc.BindFlags = 0;
396*6467f958SSadaf Ebrahimi             desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
397*6467f958SSadaf Ebrahimi             desc.MiscFlags = 0;
398*6467f958SSadaf Ebrahimi             hr = pDevice->CreateTexture3D(&desc, NULL, &pStagingBuffer);
399*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "Failed to create staging buffer.");
400*6467f958SSadaf Ebrahimi         }
401*6467f958SSadaf Ebrahimi 
402*6467f958SSadaf Ebrahimi         // wipe out the staging buffer to make sure we don't get stale values
403*6467f958SSadaf Ebrahimi         {
404*6467f958SSadaf Ebrahimi             D3D11_MAPPED_SUBRESOURCE mappedTexture;
405*6467f958SSadaf Ebrahimi             hr = pDC->Map(
406*6467f958SSadaf Ebrahimi                 pStagingBuffer,
407*6467f958SSadaf Ebrahimi                 0,
408*6467f958SSadaf Ebrahimi                 D3D11_MAP_READ_WRITE,
409*6467f958SSadaf Ebrahimi                 0,
410*6467f958SSadaf Ebrahimi                 &mappedTexture);
411*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "Failed to map staging buffer");
412*6467f958SSadaf Ebrahimi             memset(mappedTexture.pData, 0, format->bytesPerPixel);
413*6467f958SSadaf Ebrahimi             pDC->Unmap(pStagingBuffer, 0);
414*6467f958SSadaf Ebrahimi         }
415*6467f958SSadaf Ebrahimi 
416*6467f958SSadaf Ebrahimi         // copy the pixel to the staging buffer
417*6467f958SSadaf Ebrahimi         {
418*6467f958SSadaf Ebrahimi             D3D11_BOX box = {0};
419*6467f958SSadaf Ebrahimi             box.left    = x ? subResourceInfo[i].width  - 2 : 1; box.right  = box.left  + 1;
420*6467f958SSadaf Ebrahimi             box.top     = y ? subResourceInfo[i].height - 2 : 1; box.bottom = box.top   + 1;
421*6467f958SSadaf Ebrahimi             box.front   = z ? subResourceInfo[i].depth  - 2 : 1; box.back   = box.front + 1;
422*6467f958SSadaf Ebrahimi             pDC->CopySubresourceRegion(
423*6467f958SSadaf Ebrahimi                 pStagingBuffer,
424*6467f958SSadaf Ebrahimi                 0,
425*6467f958SSadaf Ebrahimi                 0,
426*6467f958SSadaf Ebrahimi                 0,
427*6467f958SSadaf Ebrahimi                 0,
428*6467f958SSadaf Ebrahimi                 pTexture,
429*6467f958SSadaf Ebrahimi                 subResourceInfo[i].subResource,
430*6467f958SSadaf Ebrahimi                 &box);
431*6467f958SSadaf Ebrahimi         }
432*6467f958SSadaf Ebrahimi 
433*6467f958SSadaf Ebrahimi         // make sure we read back what was written next door
434*6467f958SSadaf Ebrahimi         {
435*6467f958SSadaf Ebrahimi             D3D11_MAPPED_SUBRESOURCE  mappedTexture;
436*6467f958SSadaf Ebrahimi             hr = pDC->Map(
437*6467f958SSadaf Ebrahimi                 pStagingBuffer,
438*6467f958SSadaf Ebrahimi                 0,
439*6467f958SSadaf Ebrahimi                 D3D11_MAP_READ_WRITE,
440*6467f958SSadaf Ebrahimi                 0,
441*6467f958SSadaf Ebrahimi                 &mappedTexture);
442*6467f958SSadaf Ebrahimi             TestRequire(SUCCEEDED(hr), "Failed to map staging buffer");
443*6467f958SSadaf Ebrahimi             TestRequire(
444*6467f958SSadaf Ebrahimi                 !memcmp(mappedTexture.pData, texture3DPatterns[x][y][z], format->bytesPerPixel),
445*6467f958SSadaf Ebrahimi                 "Failed to map staging buffer");
446*6467f958SSadaf Ebrahimi             pDC->Unmap(pStagingBuffer, 0);
447*6467f958SSadaf Ebrahimi         }
448*6467f958SSadaf Ebrahimi 
449*6467f958SSadaf Ebrahimi         pStagingBuffer->Release();
450*6467f958SSadaf Ebrahimi     }
451*6467f958SSadaf Ebrahimi 
452*6467f958SSadaf Ebrahimi 
453*6467f958SSadaf Ebrahimi Cleanup:
454*6467f958SSadaf Ebrahimi 
455*6467f958SSadaf Ebrahimi     if (pTexture)
456*6467f958SSadaf Ebrahimi     {
457*6467f958SSadaf Ebrahimi         pTexture->Release();
458*6467f958SSadaf Ebrahimi     }
459*6467f958SSadaf Ebrahimi     for (UINT i = 0; i < size->SubResourceCount; ++i)
460*6467f958SSadaf Ebrahimi     {
461*6467f958SSadaf Ebrahimi         clReleaseMemObject(subResourceInfo[i].mem);
462*6467f958SSadaf Ebrahimi     }
463*6467f958SSadaf Ebrahimi 
464*6467f958SSadaf Ebrahimi     HarnessD3D11_TestEnd();
465*6467f958SSadaf Ebrahimi }
466*6467f958SSadaf Ebrahimi 
467*6467f958SSadaf Ebrahimi 
TestDeviceTexture3D(cl_device_id device,cl_context context,cl_command_queue command_queue,ID3D11Device * pDevice,ID3D11DeviceContext * pDC)468*6467f958SSadaf Ebrahimi void TestDeviceTexture3D(
469*6467f958SSadaf Ebrahimi     cl_device_id device,
470*6467f958SSadaf Ebrahimi     cl_context context,
471*6467f958SSadaf Ebrahimi     cl_command_queue command_queue,
472*6467f958SSadaf Ebrahimi     ID3D11Device* pDevice,
473*6467f958SSadaf Ebrahimi     ID3D11DeviceContext* pDC)
474*6467f958SSadaf Ebrahimi {
475*6467f958SSadaf Ebrahimi     cl_int result = CL_SUCCESS;
476*6467f958SSadaf Ebrahimi 
477*6467f958SSadaf Ebrahimi 
478*6467f958SSadaf Ebrahimi     for (UINT format = 0, size = 0; format < formatCount; ++size, ++format)
479*6467f958SSadaf Ebrahimi     {
480*6467f958SSadaf Ebrahimi         SubTestTexture3D(
481*6467f958SSadaf Ebrahimi             context,
482*6467f958SSadaf Ebrahimi             command_queue,
483*6467f958SSadaf Ebrahimi             pDevice,
484*6467f958SSadaf Ebrahimi             pDC,
485*6467f958SSadaf Ebrahimi             &formats[format],
486*6467f958SSadaf Ebrahimi             &texture3DSizes[size % texture3DSizeCount]);
487*6467f958SSadaf Ebrahimi     }
488*6467f958SSadaf Ebrahimi }
489*6467f958SSadaf Ebrahimi 
490