xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/d3d10umd/Resource.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker  *
3*61046927SAndroid Build Coastguard Worker  * Copyright 2012-2021 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker  * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker  * the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17*61046927SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18*61046927SAndroid Build Coastguard Worker  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19*61046927SAndroid Build Coastguard Worker  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20*61046927SAndroid Build Coastguard Worker  * USE OR OTHER DEALINGS IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker  *
22*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
23*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
24*61046927SAndroid Build Coastguard Worker  * of the Software.
25*61046927SAndroid Build Coastguard Worker  *
26*61046927SAndroid Build Coastguard Worker  **************************************************************************/
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker /*
29*61046927SAndroid Build Coastguard Worker  * Resource.cpp --
30*61046927SAndroid Build Coastguard Worker  *    Functions that manipulate GPU resources.
31*61046927SAndroid Build Coastguard Worker  */
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #include "Resource.h"
35*61046927SAndroid Build Coastguard Worker #include "Format.h"
36*61046927SAndroid Build Coastguard Worker #include "State.h"
37*61046927SAndroid Build Coastguard Worker #include "Query.h"
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #include "Debug.h"
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
42*61046927SAndroid Build Coastguard Worker #include "util/u_rect.h"
43*61046927SAndroid Build Coastguard Worker #include "util/u_surface.h"
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker /*
47*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
48*61046927SAndroid Build Coastguard Worker  *
49*61046927SAndroid Build Coastguard Worker  * CalcPrivateResourceSize --
50*61046927SAndroid Build Coastguard Worker  *
51*61046927SAndroid Build Coastguard Worker  *    The CalcPrivateResourceSize function determines the size of
52*61046927SAndroid Build Coastguard Worker  *    the user-mode display driver's private region of memory
53*61046927SAndroid Build Coastguard Worker  *    (that is, the size of internal driver structures, not the
54*61046927SAndroid Build Coastguard Worker  *    size of the resource video memory).
55*61046927SAndroid Build Coastguard Worker  *
56*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
57*61046927SAndroid Build Coastguard Worker  */
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateResourceSize(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATERESOURCE * pCreateResource)60*61046927SAndroid Build Coastguard Worker CalcPrivateResourceSize(D3D10DDI_HDEVICE hDevice,                                // IN
61*61046927SAndroid Build Coastguard Worker                         __in const D3D10DDIARG_CREATERESOURCE *pCreateResource)  // IN
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
64*61046927SAndroid Build Coastguard Worker    return sizeof(Resource);
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker static pipe_resource_usage
translate_resource_usage(UINT usage)69*61046927SAndroid Build Coastguard Worker translate_resource_usage(UINT usage)
70*61046927SAndroid Build Coastguard Worker {
71*61046927SAndroid Build Coastguard Worker    pipe_resource_usage resource_usage = PIPE_USAGE_DEFAULT;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    switch (usage) {
74*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_USAGE_DEFAULT:
75*61046927SAndroid Build Coastguard Worker       resource_usage = PIPE_USAGE_DEFAULT;
76*61046927SAndroid Build Coastguard Worker       break;
77*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_USAGE_IMMUTABLE:
78*61046927SAndroid Build Coastguard Worker       resource_usage = PIPE_USAGE_IMMUTABLE;
79*61046927SAndroid Build Coastguard Worker       break;
80*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_USAGE_DYNAMIC:
81*61046927SAndroid Build Coastguard Worker       resource_usage = PIPE_USAGE_DYNAMIC;
82*61046927SAndroid Build Coastguard Worker       break;
83*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_USAGE_STAGING:
84*61046927SAndroid Build Coastguard Worker       resource_usage = PIPE_USAGE_STAGING;
85*61046927SAndroid Build Coastguard Worker       break;
86*61046927SAndroid Build Coastguard Worker    default:
87*61046927SAndroid Build Coastguard Worker       assert(0);
88*61046927SAndroid Build Coastguard Worker       break;
89*61046927SAndroid Build Coastguard Worker    }
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker    return resource_usage;
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker static unsigned
translate_resource_flags(UINT flags)96*61046927SAndroid Build Coastguard Worker translate_resource_flags(UINT flags)
97*61046927SAndroid Build Coastguard Worker {
98*61046927SAndroid Build Coastguard Worker    unsigned bind = 0;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_VERTEX_BUFFER)
101*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_VERTEX_BUFFER;
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_INDEX_BUFFER)
104*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_INDEX_BUFFER;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_CONSTANT_BUFFER)
107*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_CONSTANT_BUFFER;
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_SHADER_RESOURCE)
110*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_SAMPLER_VIEW;
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_RENDER_TARGET)
113*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_RENDER_TARGET;
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_DEPTH_STENCIL)
116*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_DEPTH_STENCIL;
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_STREAM_OUTPUT)
119*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_STREAM_OUTPUT;
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    if (flags & D3D10_DDI_BIND_PRESENT)
122*61046927SAndroid Build Coastguard Worker       bind |= PIPE_BIND_DISPLAY_TARGET;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    return bind;
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker static enum pipe_texture_target
translate_texture_target(D3D10DDIRESOURCE_TYPE ResourceDimension,UINT ArraySize)129*61046927SAndroid Build Coastguard Worker translate_texture_target( D3D10DDIRESOURCE_TYPE ResourceDimension,
130*61046927SAndroid Build Coastguard Worker                              UINT ArraySize)
131*61046927SAndroid Build Coastguard Worker {
132*61046927SAndroid Build Coastguard Worker    assert(ArraySize >= 1);
133*61046927SAndroid Build Coastguard Worker    switch(ResourceDimension) {
134*61046927SAndroid Build Coastguard Worker    case D3D10DDIRESOURCE_BUFFER:
135*61046927SAndroid Build Coastguard Worker       assert(ArraySize == 1);
136*61046927SAndroid Build Coastguard Worker       return PIPE_BUFFER;
137*61046927SAndroid Build Coastguard Worker    case D3D10DDIRESOURCE_TEXTURE1D:
138*61046927SAndroid Build Coastguard Worker       return ArraySize > 1 ? PIPE_TEXTURE_1D_ARRAY : PIPE_TEXTURE_1D;
139*61046927SAndroid Build Coastguard Worker    case D3D10DDIRESOURCE_TEXTURE2D:
140*61046927SAndroid Build Coastguard Worker       return ArraySize > 1 ? PIPE_TEXTURE_2D_ARRAY : PIPE_TEXTURE_2D;
141*61046927SAndroid Build Coastguard Worker    case D3D10DDIRESOURCE_TEXTURE3D:
142*61046927SAndroid Build Coastguard Worker       assert(ArraySize == 1);
143*61046927SAndroid Build Coastguard Worker       return PIPE_TEXTURE_3D;
144*61046927SAndroid Build Coastguard Worker    case D3D10DDIRESOURCE_TEXTURECUBE:
145*61046927SAndroid Build Coastguard Worker       assert(ArraySize % 6 == 0);
146*61046927SAndroid Build Coastguard Worker       return ArraySize > 6 ? PIPE_TEXTURE_CUBE_ARRAY : PIPE_TEXTURE_CUBE;
147*61046927SAndroid Build Coastguard Worker    default:
148*61046927SAndroid Build Coastguard Worker       assert(0);
149*61046927SAndroid Build Coastguard Worker       return PIPE_TEXTURE_1D;
150*61046927SAndroid Build Coastguard Worker    }
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker static void
subResourceBox(struct pipe_resource * resource,UINT SubResource,unsigned * pLevel,struct pipe_box * pBox)155*61046927SAndroid Build Coastguard Worker subResourceBox(struct pipe_resource *resource, // IN
156*61046927SAndroid Build Coastguard Worker                  UINT SubResource,  // IN
157*61046927SAndroid Build Coastguard Worker                  unsigned *pLevel, // OUT
158*61046927SAndroid Build Coastguard Worker                  struct pipe_box *pBox)   // OUT
159*61046927SAndroid Build Coastguard Worker {
160*61046927SAndroid Build Coastguard Worker    UINT MipLevels = resource->last_level + 1;
161*61046927SAndroid Build Coastguard Worker    unsigned layer;
162*61046927SAndroid Build Coastguard Worker    unsigned width;
163*61046927SAndroid Build Coastguard Worker    unsigned height;
164*61046927SAndroid Build Coastguard Worker    unsigned depth;
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    *pLevel = SubResource % MipLevels;
167*61046927SAndroid Build Coastguard Worker    layer = SubResource / MipLevels;
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    width  = u_minify(resource->width0,  *pLevel);
170*61046927SAndroid Build Coastguard Worker    height = u_minify(resource->height0, *pLevel);
171*61046927SAndroid Build Coastguard Worker    depth  = u_minify(resource->depth0,  *pLevel);
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker    pBox->x = 0;
174*61046927SAndroid Build Coastguard Worker    pBox->y = 0;
175*61046927SAndroid Build Coastguard Worker    pBox->z = 0 + layer;
176*61046927SAndroid Build Coastguard Worker    pBox->width  = width;
177*61046927SAndroid Build Coastguard Worker    pBox->height = height;
178*61046927SAndroid Build Coastguard Worker    pBox->depth  = depth;
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker /*
183*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
184*61046927SAndroid Build Coastguard Worker  *
185*61046927SAndroid Build Coastguard Worker  * CreateResource --
186*61046927SAndroid Build Coastguard Worker  *
187*61046927SAndroid Build Coastguard Worker  *    The CreateResource function creates a resource.
188*61046927SAndroid Build Coastguard Worker  *
189*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
190*61046927SAndroid Build Coastguard Worker  */
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateResource(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATERESOURCE * pCreateResource,D3D10DDI_HRESOURCE hResource,D3D10DDI_HRTRESOURCE hRTResource)193*61046927SAndroid Build Coastguard Worker CreateResource(D3D10DDI_HDEVICE hDevice,                                // IN
194*61046927SAndroid Build Coastguard Worker                __in const D3D10DDIARG_CREATERESOURCE *pCreateResource,  // IN
195*61046927SAndroid Build Coastguard Worker                D3D10DDI_HRESOURCE hResource,                            // IN
196*61046927SAndroid Build Coastguard Worker                D3D10DDI_HRTRESOURCE hRTResource)                        // IN
197*61046927SAndroid Build Coastguard Worker {
198*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    if ((pCreateResource->MiscFlags & D3D10_DDI_RESOURCE_MISC_SHARED) ||
201*61046927SAndroid Build Coastguard Worker        (pCreateResource->pPrimaryDesc &&
202*61046927SAndroid Build Coastguard Worker         pCreateResource->pPrimaryDesc->DriverFlags & DXGI_DDI_PRIMARY_OPTIONAL)) {
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker       DebugPrintf("%s(%dx%dx%d hResource=%p)\n",
205*61046927SAndroid Build Coastguard Worker 	       __func__,
206*61046927SAndroid Build Coastguard Worker 	       pCreateResource->pMipInfoList[0].TexelWidth,
207*61046927SAndroid Build Coastguard Worker 	       pCreateResource->pMipInfoList[0].TexelHeight,
208*61046927SAndroid Build Coastguard Worker 	       pCreateResource->pMipInfoList[0].TexelDepth,
209*61046927SAndroid Build Coastguard Worker 	       hResource.pDrvPrivate);
210*61046927SAndroid Build Coastguard Worker       DebugPrintf("  ResourceDimension = %u\n",
211*61046927SAndroid Build Coastguard Worker 	       pCreateResource->ResourceDimension);
212*61046927SAndroid Build Coastguard Worker       DebugPrintf("  Usage = %u\n",
213*61046927SAndroid Build Coastguard Worker 	       pCreateResource->Usage);
214*61046927SAndroid Build Coastguard Worker       DebugPrintf("  BindFlags = 0x%x\n",
215*61046927SAndroid Build Coastguard Worker 	       pCreateResource->BindFlags);
216*61046927SAndroid Build Coastguard Worker       DebugPrintf("  MapFlags = 0x%x\n",
217*61046927SAndroid Build Coastguard Worker 	       pCreateResource->MapFlags);
218*61046927SAndroid Build Coastguard Worker       DebugPrintf("  MiscFlags = 0x%x\n",
219*61046927SAndroid Build Coastguard Worker 	       pCreateResource->MiscFlags);
220*61046927SAndroid Build Coastguard Worker       DebugPrintf("  Format = %s\n",
221*61046927SAndroid Build Coastguard Worker 	       FormatToName(pCreateResource->Format));
222*61046927SAndroid Build Coastguard Worker       DebugPrintf("  SampleDesc.Count = %u\n", pCreateResource->SampleDesc.Count);
223*61046927SAndroid Build Coastguard Worker       DebugPrintf("  SampleDesc.Quality = %u\n", pCreateResource->SampleDesc.Quality);
224*61046927SAndroid Build Coastguard Worker       DebugPrintf("  MipLevels = %u\n", pCreateResource->MipLevels);
225*61046927SAndroid Build Coastguard Worker       DebugPrintf("  ArraySize = %u\n", pCreateResource->ArraySize);
226*61046927SAndroid Build Coastguard Worker       DebugPrintf("  pPrimaryDesc = %p\n", pCreateResource->pPrimaryDesc);
227*61046927SAndroid Build Coastguard Worker       if (pCreateResource->pPrimaryDesc) {
228*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    Flags = 0x%x\n",
229*61046927SAndroid Build Coastguard Worker 		  pCreateResource->pPrimaryDesc->Flags);
230*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    VidPnSourceId = %u\n", pCreateResource->pPrimaryDesc->VidPnSourceId);
231*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.Width = %u\n", pCreateResource->pPrimaryDesc->ModeDesc.Width);
232*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.Height = %u\n", pCreateResource->pPrimaryDesc->ModeDesc.Height);
233*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.Format = %u)\n",
234*61046927SAndroid Build Coastguard Worker 		  pCreateResource->pPrimaryDesc->ModeDesc.Format);
235*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.RefreshRate.Numerator = %u\n", pCreateResource->pPrimaryDesc->ModeDesc.RefreshRate.Numerator);
236*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.RefreshRate.Denominator = %u\n", pCreateResource->pPrimaryDesc->ModeDesc.RefreshRate.Denominator);
237*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.ScanlineOrdering = %u\n",
238*61046927SAndroid Build Coastguard Worker 		  pCreateResource->pPrimaryDesc->ModeDesc.ScanlineOrdering);
239*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.Rotation = %u\n",
240*61046927SAndroid Build Coastguard Worker 		  pCreateResource->pPrimaryDesc->ModeDesc.Rotation);
241*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    ModeDesc.Scaling = %u\n",
242*61046927SAndroid Build Coastguard Worker 		  pCreateResource->pPrimaryDesc->ModeDesc.Scaling);
243*61046927SAndroid Build Coastguard Worker 	 DebugPrintf("    DriverFlags = 0x%x\n",
244*61046927SAndroid Build Coastguard Worker 		  pCreateResource->pPrimaryDesc->DriverFlags);
245*61046927SAndroid Build Coastguard Worker       }
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker    }
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = CastPipeContext(hDevice);
250*61046927SAndroid Build Coastguard Worker    struct pipe_screen *screen = pipe->screen;
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker    Resource *pResource = CastResource(hResource);
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    memset(pResource, 0, sizeof *pResource);
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker #if 0
257*61046927SAndroid Build Coastguard Worker    if (pCreateResource->pPrimaryDesc) {
258*61046927SAndroid Build Coastguard Worker       pCreateResource->pPrimaryDesc->DriverFlags = DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT;
259*61046927SAndroid Build Coastguard Worker       if (!(pCreateResource->pPrimaryDesc->DriverFlags & DXGI_DDI_PRIMARY_OPTIONAL)) {
260*61046927SAndroid Build Coastguard Worker          // http://msdn.microsoft.com/en-us/library/windows/hardware/ff568846.aspx
261*61046927SAndroid Build Coastguard Worker          SetError(hDevice, DXGI_DDI_ERR_UNSUPPORTED);
262*61046927SAndroid Build Coastguard Worker          return;
263*61046927SAndroid Build Coastguard Worker       }
264*61046927SAndroid Build Coastguard Worker    }
265*61046927SAndroid Build Coastguard Worker #endif
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker    pResource->Format = pCreateResource->Format;
268*61046927SAndroid Build Coastguard Worker    pResource->MipLevels = pCreateResource->MipLevels;
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker    struct pipe_resource templat;
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker    memset(&templat, 0, sizeof templat);
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker    templat.target     = translate_texture_target( pCreateResource->ResourceDimension,
275*61046927SAndroid Build Coastguard Worker                                                   pCreateResource->ArraySize );
276*61046927SAndroid Build Coastguard Worker    pResource->buffer = templat.target == PIPE_BUFFER;
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker    if (pCreateResource->Format == DXGI_FORMAT_UNKNOWN) {
279*61046927SAndroid Build Coastguard Worker       assert(pCreateResource->ResourceDimension == D3D10DDIRESOURCE_BUFFER);
280*61046927SAndroid Build Coastguard Worker       templat.format = PIPE_FORMAT_R8_UINT;
281*61046927SAndroid Build Coastguard Worker    } else {
282*61046927SAndroid Build Coastguard Worker       BOOL bindDepthStencil = !!(pCreateResource->BindFlags & D3D10_DDI_BIND_DEPTH_STENCIL);
283*61046927SAndroid Build Coastguard Worker       templat.format = FormatTranslate(pCreateResource->Format, bindDepthStencil);
284*61046927SAndroid Build Coastguard Worker    }
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker    templat.width0     = pCreateResource->pMipInfoList[0].TexelWidth;
287*61046927SAndroid Build Coastguard Worker    templat.height0    = pCreateResource->pMipInfoList[0].TexelHeight;
288*61046927SAndroid Build Coastguard Worker    templat.depth0     = pCreateResource->pMipInfoList[0].TexelDepth;
289*61046927SAndroid Build Coastguard Worker    templat.array_size = pCreateResource->ArraySize;
290*61046927SAndroid Build Coastguard Worker    templat.last_level = pCreateResource->MipLevels - 1;
291*61046927SAndroid Build Coastguard Worker    templat.nr_samples = pCreateResource->SampleDesc.Count;
292*61046927SAndroid Build Coastguard Worker    templat.nr_storage_samples = pCreateResource->SampleDesc.Count;
293*61046927SAndroid Build Coastguard Worker    templat.bind       = translate_resource_flags(pCreateResource->BindFlags);
294*61046927SAndroid Build Coastguard Worker    templat.usage      = translate_resource_usage(pCreateResource->Usage);
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker    if (templat.target != PIPE_BUFFER) {
297*61046927SAndroid Build Coastguard Worker       if (!screen->is_format_supported(screen,
298*61046927SAndroid Build Coastguard Worker                                        templat.format,
299*61046927SAndroid Build Coastguard Worker                                        templat.target,
300*61046927SAndroid Build Coastguard Worker                                        templat.nr_samples,
301*61046927SAndroid Build Coastguard Worker                                        templat.nr_storage_samples,
302*61046927SAndroid Build Coastguard Worker                                        templat.bind)) {
303*61046927SAndroid Build Coastguard Worker          debug_printf("%s: unsupported format %s\n",
304*61046927SAndroid Build Coastguard Worker                      __func__, util_format_name(templat.format));
305*61046927SAndroid Build Coastguard Worker          SetError(hDevice, E_OUTOFMEMORY);
306*61046927SAndroid Build Coastguard Worker          return;
307*61046927SAndroid Build Coastguard Worker       }
308*61046927SAndroid Build Coastguard Worker    }
309*61046927SAndroid Build Coastguard Worker 
310*61046927SAndroid Build Coastguard Worker    pResource->resource = screen->resource_create(screen, &templat);
311*61046927SAndroid Build Coastguard Worker    if (!pResource) {
312*61046927SAndroid Build Coastguard Worker       DebugPrintf("%s: failed to create resource\n", __func__);
313*61046927SAndroid Build Coastguard Worker       SetError(hDevice, E_OUTOFMEMORY);
314*61046927SAndroid Build Coastguard Worker       return;
315*61046927SAndroid Build Coastguard Worker    }
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker    pResource->NumSubResources = pCreateResource->MipLevels * pCreateResource->ArraySize;
318*61046927SAndroid Build Coastguard Worker    pResource->transfers = (struct pipe_transfer **)calloc(pResource->NumSubResources,
319*61046927SAndroid Build Coastguard Worker                                                           sizeof *pResource->transfers);
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker    if (pCreateResource->pInitialDataUP) {
322*61046927SAndroid Build Coastguard Worker       if (pResource->buffer) {
323*61046927SAndroid Build Coastguard Worker          assert(pResource->NumSubResources == 1);
324*61046927SAndroid Build Coastguard Worker          const D3D10_DDIARG_SUBRESOURCE_UP* pInitialDataUP =
325*61046927SAndroid Build Coastguard Worker                &pCreateResource->pInitialDataUP[0];
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker          unsigned level;
328*61046927SAndroid Build Coastguard Worker          struct pipe_box box;
329*61046927SAndroid Build Coastguard Worker          subResourceBox(pResource->resource, 0, &level, &box);
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker          struct pipe_transfer *transfer;
332*61046927SAndroid Build Coastguard Worker          void *map;
333*61046927SAndroid Build Coastguard Worker          map = pipe->buffer_map(pipe,
334*61046927SAndroid Build Coastguard Worker                                 pResource->resource,
335*61046927SAndroid Build Coastguard Worker                                 level,
336*61046927SAndroid Build Coastguard Worker                                 PIPE_MAP_WRITE |
337*61046927SAndroid Build Coastguard Worker                                 PIPE_MAP_UNSYNCHRONIZED,
338*61046927SAndroid Build Coastguard Worker                                 &box,
339*61046927SAndroid Build Coastguard Worker                                 &transfer);
340*61046927SAndroid Build Coastguard Worker          assert(map);
341*61046927SAndroid Build Coastguard Worker          if (map) {
342*61046927SAndroid Build Coastguard Worker             memcpy(map, pInitialDataUP->pSysMem, box.width);
343*61046927SAndroid Build Coastguard Worker             pipe_buffer_unmap(pipe, transfer);
344*61046927SAndroid Build Coastguard Worker          }
345*61046927SAndroid Build Coastguard Worker       } else {
346*61046927SAndroid Build Coastguard Worker          for (UINT SubResource = 0; SubResource < pResource->NumSubResources; ++SubResource) {
347*61046927SAndroid Build Coastguard Worker             const D3D10_DDIARG_SUBRESOURCE_UP* pInitialDataUP =
348*61046927SAndroid Build Coastguard Worker                   &pCreateResource->pInitialDataUP[SubResource];
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker             unsigned level;
351*61046927SAndroid Build Coastguard Worker             struct pipe_box box;
352*61046927SAndroid Build Coastguard Worker             subResourceBox(pResource->resource, SubResource, &level, &box);
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker             struct pipe_transfer *transfer;
355*61046927SAndroid Build Coastguard Worker             void *map;
356*61046927SAndroid Build Coastguard Worker             map = pipe->texture_map(pipe,
357*61046927SAndroid Build Coastguard Worker                                     pResource->resource,
358*61046927SAndroid Build Coastguard Worker                                     level,
359*61046927SAndroid Build Coastguard Worker                                     PIPE_MAP_WRITE |
360*61046927SAndroid Build Coastguard Worker                                     PIPE_MAP_UNSYNCHRONIZED,
361*61046927SAndroid Build Coastguard Worker                                     &box,
362*61046927SAndroid Build Coastguard Worker                                     &transfer);
363*61046927SAndroid Build Coastguard Worker             assert(map);
364*61046927SAndroid Build Coastguard Worker             if (map) {
365*61046927SAndroid Build Coastguard Worker                for (int z = 0; z < box.depth; ++z) {
366*61046927SAndroid Build Coastguard Worker                   uint8_t *dst = (uint8_t*)map + z*transfer->layer_stride;
367*61046927SAndroid Build Coastguard Worker                   const uint8_t *src = (const uint8_t*)pInitialDataUP->pSysMem + z*pInitialDataUP->SysMemSlicePitch;
368*61046927SAndroid Build Coastguard Worker                   util_copy_rect(dst,
369*61046927SAndroid Build Coastguard Worker                                  templat.format,
370*61046927SAndroid Build Coastguard Worker                                  transfer->stride,
371*61046927SAndroid Build Coastguard Worker                                  0, 0, box.width, box.height,
372*61046927SAndroid Build Coastguard Worker                                  src,
373*61046927SAndroid Build Coastguard Worker                                  pInitialDataUP->SysMemPitch,
374*61046927SAndroid Build Coastguard Worker                                  0, 0);
375*61046927SAndroid Build Coastguard Worker                }
376*61046927SAndroid Build Coastguard Worker                pipe_texture_unmap(pipe, transfer);
377*61046927SAndroid Build Coastguard Worker             }
378*61046927SAndroid Build Coastguard Worker          }
379*61046927SAndroid Build Coastguard Worker       }
380*61046927SAndroid Build Coastguard Worker    }
381*61046927SAndroid Build Coastguard Worker }
382*61046927SAndroid Build Coastguard Worker 
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker /*
385*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
386*61046927SAndroid Build Coastguard Worker  *
387*61046927SAndroid Build Coastguard Worker  * CalcPrivateOpenedResourceSize --
388*61046927SAndroid Build Coastguard Worker  *
389*61046927SAndroid Build Coastguard Worker  *    The CalcPrivateOpenedResourceSize function determines the size
390*61046927SAndroid Build Coastguard Worker  *    of the user-mode display driver's private shared region of memory
391*61046927SAndroid Build Coastguard Worker  *    (that is, the size of internal driver structures, not the size
392*61046927SAndroid Build Coastguard Worker  *    of the resource video memory) for an opened resource.
393*61046927SAndroid Build Coastguard Worker  *
394*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
395*61046927SAndroid Build Coastguard Worker  */
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateOpenedResourceSize(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_OPENRESOURCE * pOpenResource)398*61046927SAndroid Build Coastguard Worker CalcPrivateOpenedResourceSize(D3D10DDI_HDEVICE hDevice,                             // IN
399*61046927SAndroid Build Coastguard Worker                               __in const D3D10DDIARG_OPENRESOURCE *pOpenResource)   // IN
400*61046927SAndroid Build Coastguard Worker {
401*61046927SAndroid Build Coastguard Worker    return sizeof(Resource);
402*61046927SAndroid Build Coastguard Worker }
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker 
405*61046927SAndroid Build Coastguard Worker /*
406*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
407*61046927SAndroid Build Coastguard Worker  *
408*61046927SAndroid Build Coastguard Worker  * OpenResource --
409*61046927SAndroid Build Coastguard Worker  *
410*61046927SAndroid Build Coastguard Worker  *    The OpenResource function opens a shared resource.
411*61046927SAndroid Build Coastguard Worker  *
412*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
413*61046927SAndroid Build Coastguard Worker  */
414*61046927SAndroid Build Coastguard Worker 
415*61046927SAndroid Build Coastguard Worker void APIENTRY
OpenResource(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_OPENRESOURCE * pOpenResource,D3D10DDI_HRESOURCE hResource,D3D10DDI_HRTRESOURCE hRTResource)416*61046927SAndroid Build Coastguard Worker OpenResource(D3D10DDI_HDEVICE hDevice,                            // IN
417*61046927SAndroid Build Coastguard Worker              __in const D3D10DDIARG_OPENRESOURCE *pOpenResource,  // IN
418*61046927SAndroid Build Coastguard Worker              D3D10DDI_HRESOURCE hResource,                        // IN
419*61046927SAndroid Build Coastguard Worker              D3D10DDI_HRTRESOURCE hRTResource)                    // IN
420*61046927SAndroid Build Coastguard Worker {
421*61046927SAndroid Build Coastguard Worker    LOG_UNSUPPORTED_ENTRYPOINT();
422*61046927SAndroid Build Coastguard Worker    SetError(hDevice, E_OUTOFMEMORY);
423*61046927SAndroid Build Coastguard Worker }
424*61046927SAndroid Build Coastguard Worker 
425*61046927SAndroid Build Coastguard Worker 
426*61046927SAndroid Build Coastguard Worker /*
427*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
428*61046927SAndroid Build Coastguard Worker  *
429*61046927SAndroid Build Coastguard Worker  * DestroyResource --
430*61046927SAndroid Build Coastguard Worker  *
431*61046927SAndroid Build Coastguard Worker  *    The DestroyResource function destroys the specified resource
432*61046927SAndroid Build Coastguard Worker  *    object. The resource object can be destoyed only if it is not
433*61046927SAndroid Build Coastguard Worker  *    currently bound to a display device, and if all views that
434*61046927SAndroid Build Coastguard Worker  *    refer to the resource are also destroyed.
435*61046927SAndroid Build Coastguard Worker  *
436*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
437*61046927SAndroid Build Coastguard Worker  */
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker void APIENTRY
DestroyResource(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hResource)441*61046927SAndroid Build Coastguard Worker DestroyResource(D3D10DDI_HDEVICE hDevice,       // IN
442*61046927SAndroid Build Coastguard Worker                 D3D10DDI_HRESOURCE hResource)   // IN
443*61046927SAndroid Build Coastguard Worker {
444*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = CastPipeContext(hDevice);
447*61046927SAndroid Build Coastguard Worker    Resource *pResource = CastResource(hResource);
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker    if (pResource->so_target) {
450*61046927SAndroid Build Coastguard Worker       pipe_so_target_reference(&pResource->so_target, NULL);
451*61046927SAndroid Build Coastguard Worker    }
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    for (UINT SubResource = 0; SubResource < pResource->NumSubResources; ++SubResource) {
454*61046927SAndroid Build Coastguard Worker       if (pResource->transfers[SubResource]) {
455*61046927SAndroid Build Coastguard Worker          if (pResource->buffer) {
456*61046927SAndroid Build Coastguard Worker             pipe_buffer_unmap(pipe, pResource->transfers[SubResource]);
457*61046927SAndroid Build Coastguard Worker          } else {
458*61046927SAndroid Build Coastguard Worker             pipe_texture_unmap(pipe, pResource->transfers[SubResource]);
459*61046927SAndroid Build Coastguard Worker          }
460*61046927SAndroid Build Coastguard Worker          pResource->transfers[SubResource] = NULL;
461*61046927SAndroid Build Coastguard Worker       }
462*61046927SAndroid Build Coastguard Worker    }
463*61046927SAndroid Build Coastguard Worker    free(pResource->transfers);
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker    pipe_resource_reference(&pResource->resource, NULL);
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker 
469*61046927SAndroid Build Coastguard Worker /*
470*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
471*61046927SAndroid Build Coastguard Worker  *
472*61046927SAndroid Build Coastguard Worker  * ResourceMap --
473*61046927SAndroid Build Coastguard Worker  *
474*61046927SAndroid Build Coastguard Worker  *    The ResourceMap function maps a subresource of a resource.
475*61046927SAndroid Build Coastguard Worker  *
476*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
477*61046927SAndroid Build Coastguard Worker  */
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceMap(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hResource,UINT SubResource,D3D10_DDI_MAP DDIMap,UINT Flags,__out D3D10DDI_MAPPED_SUBRESOURCE * pMappedSubResource)480*61046927SAndroid Build Coastguard Worker ResourceMap(D3D10DDI_HDEVICE hDevice,                                // IN
481*61046927SAndroid Build Coastguard Worker             D3D10DDI_HRESOURCE hResource,                            // IN
482*61046927SAndroid Build Coastguard Worker             UINT SubResource,                                        // IN
483*61046927SAndroid Build Coastguard Worker             D3D10_DDI_MAP DDIMap,                                    // IN
484*61046927SAndroid Build Coastguard Worker             UINT Flags,                                              // IN
485*61046927SAndroid Build Coastguard Worker             __out D3D10DDI_MAPPED_SUBRESOURCE *pMappedSubResource)   // OUT
486*61046927SAndroid Build Coastguard Worker {
487*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = CastPipeContext(hDevice);
490*61046927SAndroid Build Coastguard Worker    Resource *pResource = CastResource(hResource);
491*61046927SAndroid Build Coastguard Worker    struct pipe_resource *resource = pResource->resource;
492*61046927SAndroid Build Coastguard Worker 
493*61046927SAndroid Build Coastguard Worker    unsigned usage;
494*61046927SAndroid Build Coastguard Worker    switch (DDIMap) {
495*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_MAP_READ:
496*61046927SAndroid Build Coastguard Worker       usage = PIPE_MAP_READ;
497*61046927SAndroid Build Coastguard Worker       break;
498*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_MAP_READWRITE:
499*61046927SAndroid Build Coastguard Worker       usage = PIPE_MAP_READ | PIPE_MAP_WRITE;
500*61046927SAndroid Build Coastguard Worker       break;
501*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_MAP_WRITE:
502*61046927SAndroid Build Coastguard Worker       usage = PIPE_MAP_WRITE;
503*61046927SAndroid Build Coastguard Worker       break;
504*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_MAP_WRITE_DISCARD:
505*61046927SAndroid Build Coastguard Worker       usage = PIPE_MAP_WRITE;
506*61046927SAndroid Build Coastguard Worker       if (resource->last_level == 0 && resource->array_size == 1) {
507*61046927SAndroid Build Coastguard Worker          usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE;
508*61046927SAndroid Build Coastguard Worker       } else {
509*61046927SAndroid Build Coastguard Worker          usage |= PIPE_MAP_DISCARD_RANGE;
510*61046927SAndroid Build Coastguard Worker       }
511*61046927SAndroid Build Coastguard Worker       break;
512*61046927SAndroid Build Coastguard Worker    case D3D10_DDI_MAP_WRITE_NOOVERWRITE:
513*61046927SAndroid Build Coastguard Worker       usage = PIPE_MAP_WRITE | PIPE_MAP_UNSYNCHRONIZED;
514*61046927SAndroid Build Coastguard Worker       break;
515*61046927SAndroid Build Coastguard Worker    default:
516*61046927SAndroid Build Coastguard Worker       assert(0);
517*61046927SAndroid Build Coastguard Worker       return;
518*61046927SAndroid Build Coastguard Worker    }
519*61046927SAndroid Build Coastguard Worker 
520*61046927SAndroid Build Coastguard Worker    assert(SubResource < pResource->NumSubResources);
521*61046927SAndroid Build Coastguard Worker 
522*61046927SAndroid Build Coastguard Worker    unsigned level;
523*61046927SAndroid Build Coastguard Worker    struct pipe_box box;
524*61046927SAndroid Build Coastguard Worker    subResourceBox(resource, SubResource, &level, &box);
525*61046927SAndroid Build Coastguard Worker 
526*61046927SAndroid Build Coastguard Worker    assert(!pResource->transfers[SubResource]);
527*61046927SAndroid Build Coastguard Worker 
528*61046927SAndroid Build Coastguard Worker    void *map;
529*61046927SAndroid Build Coastguard Worker    if (pResource->buffer) {
530*61046927SAndroid Build Coastguard Worker       map = pipe->buffer_map(pipe,
531*61046927SAndroid Build Coastguard Worker                              resource,
532*61046927SAndroid Build Coastguard Worker                              level,
533*61046927SAndroid Build Coastguard Worker                              usage,
534*61046927SAndroid Build Coastguard Worker                              &box,
535*61046927SAndroid Build Coastguard Worker                              &pResource->transfers[SubResource]);
536*61046927SAndroid Build Coastguard Worker    } else {
537*61046927SAndroid Build Coastguard Worker       map = pipe->texture_map(pipe,
538*61046927SAndroid Build Coastguard Worker                               resource,
539*61046927SAndroid Build Coastguard Worker                               level,
540*61046927SAndroid Build Coastguard Worker                               usage,
541*61046927SAndroid Build Coastguard Worker                               &box,
542*61046927SAndroid Build Coastguard Worker                               &pResource->transfers[SubResource]);
543*61046927SAndroid Build Coastguard Worker    }
544*61046927SAndroid Build Coastguard Worker    if (!map) {
545*61046927SAndroid Build Coastguard Worker       DebugPrintf("%s: failed to map resource\n", __func__);
546*61046927SAndroid Build Coastguard Worker       SetError(hDevice, E_FAIL);
547*61046927SAndroid Build Coastguard Worker       return;
548*61046927SAndroid Build Coastguard Worker    }
549*61046927SAndroid Build Coastguard Worker 
550*61046927SAndroid Build Coastguard Worker    pMappedSubResource->pData = map;
551*61046927SAndroid Build Coastguard Worker    pMappedSubResource->RowPitch = pResource->transfers[SubResource]->stride;
552*61046927SAndroid Build Coastguard Worker    pMappedSubResource->DepthPitch = pResource->transfers[SubResource]->layer_stride;
553*61046927SAndroid Build Coastguard Worker }
554*61046927SAndroid Build Coastguard Worker 
555*61046927SAndroid Build Coastguard Worker 
556*61046927SAndroid Build Coastguard Worker /*
557*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
558*61046927SAndroid Build Coastguard Worker  *
559*61046927SAndroid Build Coastguard Worker  * ResourceUnmap --
560*61046927SAndroid Build Coastguard Worker  *
561*61046927SAndroid Build Coastguard Worker  *    The ResourceUnmap function unmaps a subresource of a resource.
562*61046927SAndroid Build Coastguard Worker  *
563*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
564*61046927SAndroid Build Coastguard Worker  */
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceUnmap(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hResource,UINT SubResource)567*61046927SAndroid Build Coastguard Worker ResourceUnmap(D3D10DDI_HDEVICE hDevice,      // IN
568*61046927SAndroid Build Coastguard Worker               D3D10DDI_HRESOURCE hResource,  // IN
569*61046927SAndroid Build Coastguard Worker               UINT SubResource)              // IN
570*61046927SAndroid Build Coastguard Worker {
571*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
572*61046927SAndroid Build Coastguard Worker 
573*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = CastPipeContext(hDevice);
574*61046927SAndroid Build Coastguard Worker    Resource *pResource = CastResource(hResource);
575*61046927SAndroid Build Coastguard Worker 
576*61046927SAndroid Build Coastguard Worker    assert(SubResource < pResource->NumSubResources);
577*61046927SAndroid Build Coastguard Worker 
578*61046927SAndroid Build Coastguard Worker    if (pResource->transfers[SubResource]) {
579*61046927SAndroid Build Coastguard Worker       if (pResource->buffer) {
580*61046927SAndroid Build Coastguard Worker          pipe_buffer_unmap(pipe, pResource->transfers[SubResource]);
581*61046927SAndroid Build Coastguard Worker       } else {
582*61046927SAndroid Build Coastguard Worker          pipe_texture_unmap(pipe, pResource->transfers[SubResource]);
583*61046927SAndroid Build Coastguard Worker       }
584*61046927SAndroid Build Coastguard Worker       pResource->transfers[SubResource] = NULL;
585*61046927SAndroid Build Coastguard Worker    }
586*61046927SAndroid Build Coastguard Worker }
587*61046927SAndroid Build Coastguard Worker 
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker /*
590*61046927SAndroid Build Coastguard Worker  *----------------------------------------------------------------------
591*61046927SAndroid Build Coastguard Worker  *
592*61046927SAndroid Build Coastguard Worker  * areResourcesCompatible --
593*61046927SAndroid Build Coastguard Worker  *
594*61046927SAndroid Build Coastguard Worker  *      Check whether two resources can be safely passed to
595*61046927SAndroid Build Coastguard Worker  *      pipe_context::resource_copy_region method.
596*61046927SAndroid Build Coastguard Worker  *
597*61046927SAndroid Build Coastguard Worker  * Results:
598*61046927SAndroid Build Coastguard Worker  *      As above.
599*61046927SAndroid Build Coastguard Worker  *
600*61046927SAndroid Build Coastguard Worker  * Side effects:
601*61046927SAndroid Build Coastguard Worker  *      None.
602*61046927SAndroid Build Coastguard Worker  *
603*61046927SAndroid Build Coastguard Worker  *----------------------------------------------------------------------
604*61046927SAndroid Build Coastguard Worker  */
605*61046927SAndroid Build Coastguard Worker 
606*61046927SAndroid Build Coastguard Worker static bool
areResourcesCompatible(const struct pipe_resource * src_resource,const struct pipe_resource * dst_resource)607*61046927SAndroid Build Coastguard Worker areResourcesCompatible(const struct pipe_resource *src_resource, // IN
608*61046927SAndroid Build Coastguard Worker                        const struct pipe_resource *dst_resource) // IN
609*61046927SAndroid Build Coastguard Worker {
610*61046927SAndroid Build Coastguard Worker    if (src_resource->format == dst_resource->format) {
611*61046927SAndroid Build Coastguard Worker       /*
612*61046927SAndroid Build Coastguard Worker        * Trivial.
613*61046927SAndroid Build Coastguard Worker        */
614*61046927SAndroid Build Coastguard Worker 
615*61046927SAndroid Build Coastguard Worker       return true;
616*61046927SAndroid Build Coastguard Worker    } else if (src_resource->target == PIPE_BUFFER &&
617*61046927SAndroid Build Coastguard Worker               dst_resource->target == PIPE_BUFFER) {
618*61046927SAndroid Build Coastguard Worker       /*
619*61046927SAndroid Build Coastguard Worker        * Buffer resources are merely a collection of bytes.
620*61046927SAndroid Build Coastguard Worker        */
621*61046927SAndroid Build Coastguard Worker 
622*61046927SAndroid Build Coastguard Worker       return true;
623*61046927SAndroid Build Coastguard Worker    } else {
624*61046927SAndroid Build Coastguard Worker       /*
625*61046927SAndroid Build Coastguard Worker        * Check whether the formats are supported by
626*61046927SAndroid Build Coastguard Worker        * the resource_copy_region method.
627*61046927SAndroid Build Coastguard Worker        */
628*61046927SAndroid Build Coastguard Worker 
629*61046927SAndroid Build Coastguard Worker       const struct util_format_description *src_format_desc;
630*61046927SAndroid Build Coastguard Worker       const struct util_format_description *dst_format_desc;
631*61046927SAndroid Build Coastguard Worker 
632*61046927SAndroid Build Coastguard Worker       src_format_desc = util_format_description(src_resource->format);
633*61046927SAndroid Build Coastguard Worker       dst_format_desc = util_format_description(dst_resource->format);
634*61046927SAndroid Build Coastguard Worker 
635*61046927SAndroid Build Coastguard Worker       assert(src_format_desc->block.width  == dst_format_desc->block.width);
636*61046927SAndroid Build Coastguard Worker       assert(src_format_desc->block.height == dst_format_desc->block.height);
637*61046927SAndroid Build Coastguard Worker       assert(src_format_desc->block.bits   == dst_format_desc->block.bits);
638*61046927SAndroid Build Coastguard Worker 
639*61046927SAndroid Build Coastguard Worker       return util_is_format_compatible(src_format_desc, dst_format_desc);
640*61046927SAndroid Build Coastguard Worker    }
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker 
643*61046927SAndroid Build Coastguard Worker 
644*61046927SAndroid Build Coastguard Worker /*
645*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
646*61046927SAndroid Build Coastguard Worker  *
647*61046927SAndroid Build Coastguard Worker  * ResourceCopy --
648*61046927SAndroid Build Coastguard Worker  *
649*61046927SAndroid Build Coastguard Worker  *    The ResourceCopy function copies an entire source
650*61046927SAndroid Build Coastguard Worker  *    resource to a destination resource.
651*61046927SAndroid Build Coastguard Worker  *
652*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
653*61046927SAndroid Build Coastguard Worker  */
654*61046927SAndroid Build Coastguard Worker 
655*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceCopy(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hDstResource,D3D10DDI_HRESOURCE hSrcResource)656*61046927SAndroid Build Coastguard Worker ResourceCopy(D3D10DDI_HDEVICE hDevice,          // IN
657*61046927SAndroid Build Coastguard Worker              D3D10DDI_HRESOURCE hDstResource,   // IN
658*61046927SAndroid Build Coastguard Worker              D3D10DDI_HRESOURCE hSrcResource)   // IN
659*61046927SAndroid Build Coastguard Worker {
660*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
661*61046927SAndroid Build Coastguard Worker 
662*61046927SAndroid Build Coastguard Worker    Device *pDevice = CastDevice(hDevice);
663*61046927SAndroid Build Coastguard Worker    if (!CheckPredicate(pDevice)) {
664*61046927SAndroid Build Coastguard Worker       return;
665*61046927SAndroid Build Coastguard Worker    }
666*61046927SAndroid Build Coastguard Worker 
667*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = pDevice->pipe;
668*61046927SAndroid Build Coastguard Worker    Resource *pDstResource = CastResource(hDstResource);
669*61046927SAndroid Build Coastguard Worker    Resource *pSrcResource = CastResource(hSrcResource);
670*61046927SAndroid Build Coastguard Worker    struct pipe_resource *dst_resource = pDstResource->resource;
671*61046927SAndroid Build Coastguard Worker    struct pipe_resource *src_resource = pSrcResource->resource;
672*61046927SAndroid Build Coastguard Worker    bool compatible;
673*61046927SAndroid Build Coastguard Worker 
674*61046927SAndroid Build Coastguard Worker    assert(dst_resource->target == src_resource->target);
675*61046927SAndroid Build Coastguard Worker    assert(dst_resource->width0 == src_resource->width0);
676*61046927SAndroid Build Coastguard Worker    assert(dst_resource->height0 == src_resource->height0);
677*61046927SAndroid Build Coastguard Worker    assert(dst_resource->depth0 == src_resource->depth0);
678*61046927SAndroid Build Coastguard Worker    assert(dst_resource->last_level == src_resource->last_level);
679*61046927SAndroid Build Coastguard Worker    assert(dst_resource->array_size == src_resource->array_size);
680*61046927SAndroid Build Coastguard Worker 
681*61046927SAndroid Build Coastguard Worker    compatible = areResourcesCompatible(src_resource, dst_resource);
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker    /* could also use one 3d copy for arrays */
684*61046927SAndroid Build Coastguard Worker    for (unsigned layer = 0; layer < dst_resource->array_size; ++layer) {
685*61046927SAndroid Build Coastguard Worker       for (unsigned level = 0; level <= dst_resource->last_level; ++level) {
686*61046927SAndroid Build Coastguard Worker          struct pipe_box box;
687*61046927SAndroid Build Coastguard Worker          box.x = 0;
688*61046927SAndroid Build Coastguard Worker          box.y = 0;
689*61046927SAndroid Build Coastguard Worker          box.z = 0 + layer;
690*61046927SAndroid Build Coastguard Worker          box.width  = u_minify(dst_resource->width0,  level);
691*61046927SAndroid Build Coastguard Worker          box.height = u_minify(dst_resource->height0, level);
692*61046927SAndroid Build Coastguard Worker          box.depth  = u_minify(dst_resource->depth0,  level);
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker 	 if (compatible) {
695*61046927SAndroid Build Coastguard Worker             pipe->resource_copy_region(pipe,
696*61046927SAndroid Build Coastguard Worker                                        dst_resource, level,
697*61046927SAndroid Build Coastguard Worker                                        0, 0, layer,
698*61046927SAndroid Build Coastguard Worker                                        src_resource, level,
699*61046927SAndroid Build Coastguard Worker                                        &box);
700*61046927SAndroid Build Coastguard Worker          } else {
701*61046927SAndroid Build Coastguard Worker             util_resource_copy_region(pipe,
702*61046927SAndroid Build Coastguard Worker                                       dst_resource, level,
703*61046927SAndroid Build Coastguard Worker                                       0, 0, layer,
704*61046927SAndroid Build Coastguard Worker                                       src_resource, level,
705*61046927SAndroid Build Coastguard Worker                                       &box);
706*61046927SAndroid Build Coastguard Worker          }
707*61046927SAndroid Build Coastguard Worker       }
708*61046927SAndroid Build Coastguard Worker    }
709*61046927SAndroid Build Coastguard Worker }
710*61046927SAndroid Build Coastguard Worker 
711*61046927SAndroid Build Coastguard Worker 
712*61046927SAndroid Build Coastguard Worker /*
713*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
714*61046927SAndroid Build Coastguard Worker  *
715*61046927SAndroid Build Coastguard Worker  * ResourceCopyRegion --
716*61046927SAndroid Build Coastguard Worker  *
717*61046927SAndroid Build Coastguard Worker  *    The ResourceCopyRegion function copies a source subresource
718*61046927SAndroid Build Coastguard Worker  *    region to a location on a destination subresource.
719*61046927SAndroid Build Coastguard Worker  *
720*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
721*61046927SAndroid Build Coastguard Worker  */
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceCopyRegion(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hDstResource,UINT DstSubResource,UINT DstX,UINT DstY,UINT DstZ,D3D10DDI_HRESOURCE hSrcResource,UINT SrcSubResource,__in_opt const D3D10_DDI_BOX * pSrcBox)724*61046927SAndroid Build Coastguard Worker ResourceCopyRegion(D3D10DDI_HDEVICE hDevice,                // IN
725*61046927SAndroid Build Coastguard Worker                    D3D10DDI_HRESOURCE hDstResource,         // IN
726*61046927SAndroid Build Coastguard Worker                    UINT DstSubResource,                     // IN
727*61046927SAndroid Build Coastguard Worker                    UINT DstX,                               // IN
728*61046927SAndroid Build Coastguard Worker                    UINT DstY,                               // IN
729*61046927SAndroid Build Coastguard Worker                    UINT DstZ,                               // IN
730*61046927SAndroid Build Coastguard Worker                    D3D10DDI_HRESOURCE hSrcResource,         // IN
731*61046927SAndroid Build Coastguard Worker                    UINT SrcSubResource,                     // IN
732*61046927SAndroid Build Coastguard Worker                    __in_opt const D3D10_DDI_BOX *pSrcBox)   // IN (optional)
733*61046927SAndroid Build Coastguard Worker {
734*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
735*61046927SAndroid Build Coastguard Worker 
736*61046927SAndroid Build Coastguard Worker    Device *pDevice = CastDevice(hDevice);
737*61046927SAndroid Build Coastguard Worker    if (!CheckPredicate(pDevice)) {
738*61046927SAndroid Build Coastguard Worker       return;
739*61046927SAndroid Build Coastguard Worker    }
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = pDevice->pipe;
742*61046927SAndroid Build Coastguard Worker    Resource *pDstResource = CastResource(hDstResource);
743*61046927SAndroid Build Coastguard Worker    Resource *pSrcResource = CastResource(hSrcResource);
744*61046927SAndroid Build Coastguard Worker    struct pipe_resource *dst_resource = pDstResource->resource;
745*61046927SAndroid Build Coastguard Worker    struct pipe_resource *src_resource = pSrcResource->resource;
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker    unsigned dst_level = DstSubResource % (dst_resource->last_level + 1);
748*61046927SAndroid Build Coastguard Worker    unsigned dst_layer = DstSubResource / (dst_resource->last_level + 1);
749*61046927SAndroid Build Coastguard Worker    unsigned src_level = SrcSubResource % (src_resource->last_level + 1);
750*61046927SAndroid Build Coastguard Worker    unsigned src_layer = SrcSubResource / (src_resource->last_level + 1);
751*61046927SAndroid Build Coastguard Worker 
752*61046927SAndroid Build Coastguard Worker    struct pipe_box src_box;
753*61046927SAndroid Build Coastguard Worker    if (pSrcBox) {
754*61046927SAndroid Build Coastguard Worker       src_box.x = pSrcBox->left;
755*61046927SAndroid Build Coastguard Worker       src_box.y = pSrcBox->top;
756*61046927SAndroid Build Coastguard Worker       src_box.z = pSrcBox->front + src_layer;
757*61046927SAndroid Build Coastguard Worker       src_box.width  = pSrcBox->right  - pSrcBox->left;
758*61046927SAndroid Build Coastguard Worker       src_box.height = pSrcBox->bottom - pSrcBox->top;
759*61046927SAndroid Build Coastguard Worker       src_box.depth  = pSrcBox->back   - pSrcBox->front;
760*61046927SAndroid Build Coastguard Worker    } else {
761*61046927SAndroid Build Coastguard Worker       src_box.x = 0;
762*61046927SAndroid Build Coastguard Worker       src_box.y = 0;
763*61046927SAndroid Build Coastguard Worker       src_box.z = 0 + src_layer;
764*61046927SAndroid Build Coastguard Worker       src_box.width  = u_minify(src_resource->width0,  src_level);
765*61046927SAndroid Build Coastguard Worker       src_box.height = u_minify(src_resource->height0, src_level);
766*61046927SAndroid Build Coastguard Worker       src_box.depth  = u_minify(src_resource->depth0,  src_level);
767*61046927SAndroid Build Coastguard Worker    }
768*61046927SAndroid Build Coastguard Worker 
769*61046927SAndroid Build Coastguard Worker    if (areResourcesCompatible(src_resource, dst_resource)) {
770*61046927SAndroid Build Coastguard Worker       pipe->resource_copy_region(pipe,
771*61046927SAndroid Build Coastguard Worker                                  dst_resource, dst_level,
772*61046927SAndroid Build Coastguard Worker                                  DstX, DstY, DstZ + dst_layer,
773*61046927SAndroid Build Coastguard Worker                                  src_resource, src_level,
774*61046927SAndroid Build Coastguard Worker                                  &src_box);
775*61046927SAndroid Build Coastguard Worker    } else {
776*61046927SAndroid Build Coastguard Worker       util_resource_copy_region(pipe,
777*61046927SAndroid Build Coastguard Worker                                 dst_resource, dst_level,
778*61046927SAndroid Build Coastguard Worker                                 DstX, DstY, DstZ + dst_layer,
779*61046927SAndroid Build Coastguard Worker                                 src_resource, src_level,
780*61046927SAndroid Build Coastguard Worker                                 &src_box);
781*61046927SAndroid Build Coastguard Worker    }
782*61046927SAndroid Build Coastguard Worker }
783*61046927SAndroid Build Coastguard Worker 
784*61046927SAndroid Build Coastguard Worker 
785*61046927SAndroid Build Coastguard Worker /*
786*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
787*61046927SAndroid Build Coastguard Worker  *
788*61046927SAndroid Build Coastguard Worker  * ResourceResolveSubResource --
789*61046927SAndroid Build Coastguard Worker  *
790*61046927SAndroid Build Coastguard Worker  *    The ResourceResolveSubResource function resolves
791*61046927SAndroid Build Coastguard Worker  *    multiple samples to one pixel.
792*61046927SAndroid Build Coastguard Worker  *
793*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
794*61046927SAndroid Build Coastguard Worker  */
795*61046927SAndroid Build Coastguard Worker 
796*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceResolveSubResource(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hDstResource,UINT DstSubResource,D3D10DDI_HRESOURCE hSrcResource,UINT SrcSubResource,DXGI_FORMAT ResolveFormat)797*61046927SAndroid Build Coastguard Worker ResourceResolveSubResource(D3D10DDI_HDEVICE hDevice,        // IN
798*61046927SAndroid Build Coastguard Worker                            D3D10DDI_HRESOURCE hDstResource, // IN
799*61046927SAndroid Build Coastguard Worker                            UINT DstSubResource,             // IN
800*61046927SAndroid Build Coastguard Worker                            D3D10DDI_HRESOURCE hSrcResource, // IN
801*61046927SAndroid Build Coastguard Worker                            UINT SrcSubResource,             // IN
802*61046927SAndroid Build Coastguard Worker                            DXGI_FORMAT ResolveFormat)       // IN
803*61046927SAndroid Build Coastguard Worker {
804*61046927SAndroid Build Coastguard Worker    LOG_UNSUPPORTED_ENTRYPOINT();
805*61046927SAndroid Build Coastguard Worker }
806*61046927SAndroid Build Coastguard Worker 
807*61046927SAndroid Build Coastguard Worker 
808*61046927SAndroid Build Coastguard Worker /*
809*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
810*61046927SAndroid Build Coastguard Worker  *
811*61046927SAndroid Build Coastguard Worker  * ResourceIsStagingBusy --
812*61046927SAndroid Build Coastguard Worker  *
813*61046927SAndroid Build Coastguard Worker  *    The ResourceIsStagingBusy function determines whether a
814*61046927SAndroid Build Coastguard Worker  *    resource is currently being used by the graphics pipeline.
815*61046927SAndroid Build Coastguard Worker  *
816*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
817*61046927SAndroid Build Coastguard Worker  */
818*61046927SAndroid Build Coastguard Worker 
819*61046927SAndroid Build Coastguard Worker BOOL APIENTRY
ResourceIsStagingBusy(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hResource)820*61046927SAndroid Build Coastguard Worker ResourceIsStagingBusy(D3D10DDI_HDEVICE hDevice,       // IN
821*61046927SAndroid Build Coastguard Worker                       D3D10DDI_HRESOURCE hResource)   // IN
822*61046927SAndroid Build Coastguard Worker {
823*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
824*61046927SAndroid Build Coastguard Worker 
825*61046927SAndroid Build Coastguard Worker    /* ignore */
826*61046927SAndroid Build Coastguard Worker 
827*61046927SAndroid Build Coastguard Worker    return false;
828*61046927SAndroid Build Coastguard Worker }
829*61046927SAndroid Build Coastguard Worker 
830*61046927SAndroid Build Coastguard Worker 
831*61046927SAndroid Build Coastguard Worker /*
832*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
833*61046927SAndroid Build Coastguard Worker  *
834*61046927SAndroid Build Coastguard Worker  * ResourceReadAfterWriteHazard --
835*61046927SAndroid Build Coastguard Worker  *
836*61046927SAndroid Build Coastguard Worker  *    The ResourceReadAfterWriteHazard function informs the user-mode
837*61046927SAndroid Build Coastguard Worker  *    display driver that the specified resource was used as an output
838*61046927SAndroid Build Coastguard Worker  *    from the graphics processing unit (GPU) and that the resource
839*61046927SAndroid Build Coastguard Worker  *    will be used as an input to the GPU.
840*61046927SAndroid Build Coastguard Worker  *
841*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
842*61046927SAndroid Build Coastguard Worker  */
843*61046927SAndroid Build Coastguard Worker 
844*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceReadAfterWriteHazard(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hResource)845*61046927SAndroid Build Coastguard Worker ResourceReadAfterWriteHazard(D3D10DDI_HDEVICE hDevice,      // IN
846*61046927SAndroid Build Coastguard Worker                              D3D10DDI_HRESOURCE hResource)  // IN
847*61046927SAndroid Build Coastguard Worker {
848*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
849*61046927SAndroid Build Coastguard Worker 
850*61046927SAndroid Build Coastguard Worker    /* Not actually necessary */
851*61046927SAndroid Build Coastguard Worker }
852*61046927SAndroid Build Coastguard Worker 
853*61046927SAndroid Build Coastguard Worker 
854*61046927SAndroid Build Coastguard Worker /*
855*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
856*61046927SAndroid Build Coastguard Worker  *
857*61046927SAndroid Build Coastguard Worker  * ResourceUpdateSubResourceUP --
858*61046927SAndroid Build Coastguard Worker  *
859*61046927SAndroid Build Coastguard Worker  *    The ResourceUpdateSubresourceUP function updates a
860*61046927SAndroid Build Coastguard Worker  *    destination subresource region from a source
861*61046927SAndroid Build Coastguard Worker  *    system memory region.
862*61046927SAndroid Build Coastguard Worker  *
863*61046927SAndroid Build Coastguard Worker  * ----------------------------------------------------------------------
864*61046927SAndroid Build Coastguard Worker  */
865*61046927SAndroid Build Coastguard Worker 
866*61046927SAndroid Build Coastguard Worker void APIENTRY
ResourceUpdateSubResourceUP(D3D10DDI_HDEVICE hDevice,D3D10DDI_HRESOURCE hDstResource,UINT DstSubResource,__in_opt const D3D10_DDI_BOX * pDstBox,__in const void * pSysMemUP,UINT RowPitch,UINT DepthPitch)867*61046927SAndroid Build Coastguard Worker ResourceUpdateSubResourceUP(D3D10DDI_HDEVICE hDevice,                // IN
868*61046927SAndroid Build Coastguard Worker                             D3D10DDI_HRESOURCE hDstResource,         // IN
869*61046927SAndroid Build Coastguard Worker                             UINT DstSubResource,                     // IN
870*61046927SAndroid Build Coastguard Worker                             __in_opt const D3D10_DDI_BOX *pDstBox,   // IN
871*61046927SAndroid Build Coastguard Worker                             __in const void *pSysMemUP,              // IN
872*61046927SAndroid Build Coastguard Worker                             UINT RowPitch,                           // IN
873*61046927SAndroid Build Coastguard Worker                             UINT DepthPitch)                         // IN
874*61046927SAndroid Build Coastguard Worker {
875*61046927SAndroid Build Coastguard Worker    LOG_ENTRYPOINT();
876*61046927SAndroid Build Coastguard Worker 
877*61046927SAndroid Build Coastguard Worker    Device *pDevice = CastDevice(hDevice);
878*61046927SAndroid Build Coastguard Worker    if (!CheckPredicate(pDevice)) {
879*61046927SAndroid Build Coastguard Worker       return;
880*61046927SAndroid Build Coastguard Worker    }
881*61046927SAndroid Build Coastguard Worker 
882*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = pDevice->pipe;
883*61046927SAndroid Build Coastguard Worker    Resource *pDstResource = CastResource(hDstResource);
884*61046927SAndroid Build Coastguard Worker    struct pipe_resource *dst_resource = pDstResource->resource;
885*61046927SAndroid Build Coastguard Worker 
886*61046927SAndroid Build Coastguard Worker    unsigned level;
887*61046927SAndroid Build Coastguard Worker    struct pipe_box box;
888*61046927SAndroid Build Coastguard Worker 
889*61046927SAndroid Build Coastguard Worker    if (pDstBox) {
890*61046927SAndroid Build Coastguard Worker       UINT DstMipLevels = dst_resource->last_level + 1;
891*61046927SAndroid Build Coastguard Worker       level = DstSubResource % DstMipLevels;
892*61046927SAndroid Build Coastguard Worker       unsigned dst_layer = DstSubResource / DstMipLevels;
893*61046927SAndroid Build Coastguard Worker       box.x = pDstBox->left;
894*61046927SAndroid Build Coastguard Worker       box.y = pDstBox->top;
895*61046927SAndroid Build Coastguard Worker       box.z = pDstBox->front + dst_layer;
896*61046927SAndroid Build Coastguard Worker       box.width  = pDstBox->right  - pDstBox->left;
897*61046927SAndroid Build Coastguard Worker       box.height = pDstBox->bottom - pDstBox->top;
898*61046927SAndroid Build Coastguard Worker       box.depth  = pDstBox->back   - pDstBox->front;
899*61046927SAndroid Build Coastguard Worker    } else {
900*61046927SAndroid Build Coastguard Worker       subResourceBox(dst_resource, DstSubResource, &level, &box);
901*61046927SAndroid Build Coastguard Worker    }
902*61046927SAndroid Build Coastguard Worker 
903*61046927SAndroid Build Coastguard Worker    struct pipe_transfer *transfer;
904*61046927SAndroid Build Coastguard Worker    void *map;
905*61046927SAndroid Build Coastguard Worker    if (pDstResource->buffer) {
906*61046927SAndroid Build Coastguard Worker       map = pipe->buffer_map(pipe,
907*61046927SAndroid Build Coastguard Worker                               dst_resource,
908*61046927SAndroid Build Coastguard Worker                               level,
909*61046927SAndroid Build Coastguard Worker                               PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,
910*61046927SAndroid Build Coastguard Worker                               &box,
911*61046927SAndroid Build Coastguard Worker                               &transfer);
912*61046927SAndroid Build Coastguard Worker    } else {
913*61046927SAndroid Build Coastguard Worker       map = pipe->texture_map(pipe,
914*61046927SAndroid Build Coastguard Worker                               dst_resource,
915*61046927SAndroid Build Coastguard Worker                               level,
916*61046927SAndroid Build Coastguard Worker                               PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,
917*61046927SAndroid Build Coastguard Worker                               &box,
918*61046927SAndroid Build Coastguard Worker                               &transfer);
919*61046927SAndroid Build Coastguard Worker    }
920*61046927SAndroid Build Coastguard Worker    assert(map);
921*61046927SAndroid Build Coastguard Worker    if (map) {
922*61046927SAndroid Build Coastguard Worker       for (int z = 0; z < box.depth; ++z) {
923*61046927SAndroid Build Coastguard Worker          uint8_t *dst = (uint8_t*)map + z*transfer->layer_stride;
924*61046927SAndroid Build Coastguard Worker          const uint8_t *src = (const uint8_t*)pSysMemUP + z*DepthPitch;
925*61046927SAndroid Build Coastguard Worker          util_copy_rect(dst,
926*61046927SAndroid Build Coastguard Worker                         dst_resource->format,
927*61046927SAndroid Build Coastguard Worker                         transfer->stride,
928*61046927SAndroid Build Coastguard Worker                         0, 0, box.width, box.height,
929*61046927SAndroid Build Coastguard Worker                         src,
930*61046927SAndroid Build Coastguard Worker                         RowPitch,
931*61046927SAndroid Build Coastguard Worker                         0, 0);
932*61046927SAndroid Build Coastguard Worker       }
933*61046927SAndroid Build Coastguard Worker       if (pDstResource->buffer) {
934*61046927SAndroid Build Coastguard Worker          pipe_buffer_unmap(pipe, transfer);
935*61046927SAndroid Build Coastguard Worker       } else {
936*61046927SAndroid Build Coastguard Worker          pipe_texture_unmap(pipe, transfer);
937*61046927SAndroid Build Coastguard Worker       }
938*61046927SAndroid Build Coastguard Worker    }
939*61046927SAndroid Build Coastguard Worker }
940*61046927SAndroid Build Coastguard Worker 
941