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