1bf215546Sopenharmony_ci/**************************************************************************
2bf215546Sopenharmony_ci *
3bf215546Sopenharmony_ci * Copyright 2012-2021 VMware, Inc.
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17bf215546Sopenharmony_ci * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18bf215546Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19bf215546Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20bf215546Sopenharmony_ci * USE OR OTHER DEALINGS IN THE SOFTWARE.
21bf215546Sopenharmony_ci *
22bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
23bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
24bf215546Sopenharmony_ci * of the Software.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci **************************************************************************/
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci/*
29bf215546Sopenharmony_ci * DxgiFns.cpp --
30bf215546Sopenharmony_ci *    DXGI related functions.
31bf215546Sopenharmony_ci */
32bf215546Sopenharmony_ci
33bf215546Sopenharmony_ci#include <stdio.h>
34bf215546Sopenharmony_ci
35bf215546Sopenharmony_ci#include "DxgiFns.h"
36bf215546Sopenharmony_ci#include "Format.h"
37bf215546Sopenharmony_ci#include "State.h"
38bf215546Sopenharmony_ci
39bf215546Sopenharmony_ci#include "Debug.h"
40bf215546Sopenharmony_ci
41bf215546Sopenharmony_ci#include "util/format/u_format.h"
42bf215546Sopenharmony_ci
43bf215546Sopenharmony_ci
44bf215546Sopenharmony_ci/*
45bf215546Sopenharmony_ci * ----------------------------------------------------------------------
46bf215546Sopenharmony_ci *
47bf215546Sopenharmony_ci * _Present --
48bf215546Sopenharmony_ci *
49bf215546Sopenharmony_ci *    This is turned into kernel callbacks rather than directly emitted
50bf215546Sopenharmony_ci *    as fifo packets.
51bf215546Sopenharmony_ci *
52bf215546Sopenharmony_ci * ----------------------------------------------------------------------
53bf215546Sopenharmony_ci */
54bf215546Sopenharmony_ci
55bf215546Sopenharmony_ciHRESULT APIENTRY
56bf215546Sopenharmony_ci_Present(DXGI_DDI_ARG_PRESENT *pPresentData)
57bf215546Sopenharmony_ci{
58bf215546Sopenharmony_ci
59bf215546Sopenharmony_ci   LOG_ENTRYPOINT();
60bf215546Sopenharmony_ci
61bf215546Sopenharmony_ci   struct pipe_context *pipe = CastPipeDevice(pPresentData->hDevice);
62bf215546Sopenharmony_ci   Resource *pSrcResource = CastResource(pPresentData->hSurfaceToPresent);
63bf215546Sopenharmony_ci
64bf215546Sopenharmony_ci   D3DKMT_PRESENT *pPresentInfo = (D3DKMT_PRESENT *)pPresentData->pDXGIContext;
65bf215546Sopenharmony_ci
66bf215546Sopenharmony_ci   HWND hWnd = pPresentInfo->hWindow;
67bf215546Sopenharmony_ci
68bf215546Sopenharmony_ci   if (0) {
69bf215546Sopenharmony_ci      DebugPrintf("  hWindow = 0x%08lx\n", pPresentInfo->hWindow);
70bf215546Sopenharmony_ci      if (pPresentInfo->Flags.SrcRectValid) {
71bf215546Sopenharmony_ci         DebugPrintf("  SrcRect.left = %li\n", pPresentInfo->SrcRect.left);
72bf215546Sopenharmony_ci         DebugPrintf("  SrcRect.top = %li\n", pPresentInfo->SrcRect.top);
73bf215546Sopenharmony_ci         DebugPrintf("  SrcRect.right = %li\n", pPresentInfo->SrcRect.right);
74bf215546Sopenharmony_ci         DebugPrintf("  SrcRect.bottom = %li\n", pPresentInfo->SrcRect.bottom);
75bf215546Sopenharmony_ci      }
76bf215546Sopenharmony_ci      if (pPresentInfo->Flags.DstRectValid) {
77bf215546Sopenharmony_ci         DebugPrintf("  DstRect.left = %li\n", pPresentInfo->DstRect.left);
78bf215546Sopenharmony_ci         DebugPrintf("  DstRect.top = %li\n", pPresentInfo->DstRect.top);
79bf215546Sopenharmony_ci         DebugPrintf("  DstRect.right = %li\n", pPresentInfo->DstRect.right);
80bf215546Sopenharmony_ci         DebugPrintf("  DstRect.bottom = %li\n", pPresentInfo->DstRect.bottom);
81bf215546Sopenharmony_ci      }
82bf215546Sopenharmony_ci   }
83bf215546Sopenharmony_ci
84bf215546Sopenharmony_ci   RECT rect;
85bf215546Sopenharmony_ci   if (!GetClientRect(hWnd, &rect)) {
86bf215546Sopenharmony_ci      DebugPrintf("Invalid window.\n");
87bf215546Sopenharmony_ci      return S_OK;
88bf215546Sopenharmony_ci   }
89bf215546Sopenharmony_ci
90bf215546Sopenharmony_ci   int windowWidth  = rect.right  - rect.left;
91bf215546Sopenharmony_ci   int windowHeight = rect.bottom - rect.top;
92bf215546Sopenharmony_ci
93bf215546Sopenharmony_ci   HDC hDC = GetDC(hWnd);
94bf215546Sopenharmony_ci
95bf215546Sopenharmony_ci   unsigned w = pSrcResource->resource->width0;
96bf215546Sopenharmony_ci   unsigned h = pSrcResource->resource->height0;
97bf215546Sopenharmony_ci
98bf215546Sopenharmony_ci   void *map;
99bf215546Sopenharmony_ci   struct pipe_transfer *transfer;
100bf215546Sopenharmony_ci   map = pipe_texture_map(pipe,
101bf215546Sopenharmony_ci                          pSrcResource->resource,
102bf215546Sopenharmony_ci                          0, 0, PIPE_MAP_READ,
103bf215546Sopenharmony_ci                          0, 0, w, h,
104bf215546Sopenharmony_ci                          &transfer);
105bf215546Sopenharmony_ci   if (map) {
106bf215546Sopenharmony_ci
107bf215546Sopenharmony_ci      BITMAPINFO bmi;
108bf215546Sopenharmony_ci
109bf215546Sopenharmony_ci      memset(&bmi, 0, sizeof bmi);
110bf215546Sopenharmony_ci      bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
111bf215546Sopenharmony_ci      bmi.bmiHeader.biWidth = w;
112bf215546Sopenharmony_ci      bmi.bmiHeader.biHeight= -(long)h;
113bf215546Sopenharmony_ci      bmi.bmiHeader.biPlanes = 1;
114bf215546Sopenharmony_ci      bmi.bmiHeader.biBitCount = 32;
115bf215546Sopenharmony_ci      bmi.bmiHeader.biCompression = BI_RGB;
116bf215546Sopenharmony_ci      bmi.bmiHeader.biSizeImage = 0;
117bf215546Sopenharmony_ci      bmi.bmiHeader.biXPelsPerMeter = 0;
118bf215546Sopenharmony_ci      bmi.bmiHeader.biYPelsPerMeter = 0;
119bf215546Sopenharmony_ci      bmi.bmiHeader.biClrUsed = 0;
120bf215546Sopenharmony_ci      bmi.bmiHeader.biClrImportant = 0;
121bf215546Sopenharmony_ci
122bf215546Sopenharmony_ci      DWORD *pixels = NULL;
123bf215546Sopenharmony_ci
124bf215546Sopenharmony_ci      // http://www.daniweb.com/software-development/cpp/code/241875/fast-animation-with-the-windows-gdi
125bf215546Sopenharmony_ci
126bf215546Sopenharmony_ci      HBITMAP hBmp = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pixels, NULL, 0);
127bf215546Sopenharmony_ci
128bf215546Sopenharmony_ci      util_format_translate(
129bf215546Sopenharmony_ci            PIPE_FORMAT_B8G8R8X8_UNORM,
130bf215546Sopenharmony_ci            (void *)pixels, w * 4,
131bf215546Sopenharmony_ci            0, 0,
132bf215546Sopenharmony_ci            pSrcResource->resource->format,
133bf215546Sopenharmony_ci            map, transfer->stride,
134bf215546Sopenharmony_ci            0, 0, w, h);
135bf215546Sopenharmony_ci
136bf215546Sopenharmony_ci      if (0) {
137bf215546Sopenharmony_ci         /*
138bf215546Sopenharmony_ci          * Save a BMP for debugging.
139bf215546Sopenharmony_ci          */
140bf215546Sopenharmony_ci
141bf215546Sopenharmony_ci         FILE *fp = fopen("present.bmp", "wb");
142bf215546Sopenharmony_ci         if (fp) {
143bf215546Sopenharmony_ci            BITMAPFILEHEADER bmf;
144bf215546Sopenharmony_ci            bmf.bfType = 0x4d42;
145bf215546Sopenharmony_ci            bmf.bfSize = sizeof bmf + sizeof bmi + h * w * 4;
146bf215546Sopenharmony_ci            bmf.bfReserved1 = 0;
147bf215546Sopenharmony_ci            bmf.bfReserved2 = 0;
148bf215546Sopenharmony_ci            bmf.bfOffBits = sizeof bmf + sizeof bmi;
149bf215546Sopenharmony_ci
150bf215546Sopenharmony_ci            fwrite(&bmf, sizeof bmf, 1, fp);
151bf215546Sopenharmony_ci            fwrite(&bmi, sizeof bmi, 1, fp);
152bf215546Sopenharmony_ci            fwrite(pixels, h, w * 4, fp);
153bf215546Sopenharmony_ci            fclose(fp);
154bf215546Sopenharmony_ci         }
155bf215546Sopenharmony_ci      }
156bf215546Sopenharmony_ci
157bf215546Sopenharmony_ci      HDC hdcMem;
158bf215546Sopenharmony_ci      hdcMem = CreateCompatibleDC(hDC);
159bf215546Sopenharmony_ci      HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hBmp);
160bf215546Sopenharmony_ci
161bf215546Sopenharmony_ci      int iStretchMode = SetStretchBltMode(hDC, HALFTONE);
162bf215546Sopenharmony_ci
163bf215546Sopenharmony_ci      StretchBlt(hDC, 0, 0, windowWidth, windowHeight,
164bf215546Sopenharmony_ci                 hdcMem, 0, 0, w, h,
165bf215546Sopenharmony_ci                 SRCCOPY);
166bf215546Sopenharmony_ci
167bf215546Sopenharmony_ci      if (iStretchMode) {
168bf215546Sopenharmony_ci         SetStretchBltMode(hDC, iStretchMode);
169bf215546Sopenharmony_ci      }
170bf215546Sopenharmony_ci
171bf215546Sopenharmony_ci      SelectObject(hdcMem, hbmOld);
172bf215546Sopenharmony_ci      DeleteDC(hdcMem);
173bf215546Sopenharmony_ci      DeleteObject(hBmp);
174bf215546Sopenharmony_ci
175bf215546Sopenharmony_ci      pipe_texture_unmap(pipe, transfer);
176bf215546Sopenharmony_ci   }
177bf215546Sopenharmony_ci
178bf215546Sopenharmony_ci   ReleaseDC(hWnd, hDC);
179bf215546Sopenharmony_ci
180bf215546Sopenharmony_ci   return S_OK;
181bf215546Sopenharmony_ci}
182bf215546Sopenharmony_ci
183bf215546Sopenharmony_ci
184bf215546Sopenharmony_ci/*
185bf215546Sopenharmony_ci * ----------------------------------------------------------------------
186bf215546Sopenharmony_ci *
187bf215546Sopenharmony_ci * _GetGammaCaps --
188bf215546Sopenharmony_ci *
189bf215546Sopenharmony_ci *    Return gamma capabilities.
190bf215546Sopenharmony_ci *
191bf215546Sopenharmony_ci * ----------------------------------------------------------------------
192bf215546Sopenharmony_ci */
193bf215546Sopenharmony_ci
194bf215546Sopenharmony_ciHRESULT APIENTRY
195bf215546Sopenharmony_ci_GetGammaCaps( DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS *GetCaps )
196bf215546Sopenharmony_ci{
197bf215546Sopenharmony_ci   LOG_ENTRYPOINT();
198bf215546Sopenharmony_ci
199bf215546Sopenharmony_ci   DXGI_GAMMA_CONTROL_CAPABILITIES *pCaps;
200bf215546Sopenharmony_ci
201bf215546Sopenharmony_ci   pCaps = GetCaps->pGammaCapabilities;
202bf215546Sopenharmony_ci
203bf215546Sopenharmony_ci   pCaps->ScaleAndOffsetSupported = FALSE;
204bf215546Sopenharmony_ci   pCaps->MinConvertedValue = 0.0;
205bf215546Sopenharmony_ci   pCaps->MaxConvertedValue = 1.0;
206bf215546Sopenharmony_ci   pCaps->NumGammaControlPoints = 17;
207bf215546Sopenharmony_ci
208bf215546Sopenharmony_ci   for (UINT i = 0; i < pCaps->NumGammaControlPoints; i++) {
209bf215546Sopenharmony_ci      pCaps->ControlPointPositions[i] = (float)i / (float)(pCaps->NumGammaControlPoints - 1);
210bf215546Sopenharmony_ci   }
211bf215546Sopenharmony_ci
212bf215546Sopenharmony_ci   return S_OK;
213bf215546Sopenharmony_ci}
214bf215546Sopenharmony_ci
215bf215546Sopenharmony_ci
216bf215546Sopenharmony_ci/*
217bf215546Sopenharmony_ci * ----------------------------------------------------------------------
218bf215546Sopenharmony_ci *
219bf215546Sopenharmony_ci * _SetDisplayMode --
220bf215546Sopenharmony_ci *
221bf215546Sopenharmony_ci *    Set the resource that is used to scan out to the display.
222bf215546Sopenharmony_ci *
223bf215546Sopenharmony_ci * ----------------------------------------------------------------------
224bf215546Sopenharmony_ci */
225bf215546Sopenharmony_ci
226bf215546Sopenharmony_ciHRESULT APIENTRY
227bf215546Sopenharmony_ci_SetDisplayMode( DXGI_DDI_ARG_SETDISPLAYMODE *SetDisplayMode )
228bf215546Sopenharmony_ci{
229bf215546Sopenharmony_ci   LOG_UNSUPPORTED_ENTRYPOINT();
230bf215546Sopenharmony_ci
231bf215546Sopenharmony_ci   return S_OK;
232bf215546Sopenharmony_ci}
233bf215546Sopenharmony_ci
234bf215546Sopenharmony_ci
235bf215546Sopenharmony_ci/*
236bf215546Sopenharmony_ci * ----------------------------------------------------------------------
237bf215546Sopenharmony_ci *
238bf215546Sopenharmony_ci * _SetResourcePriority --
239bf215546Sopenharmony_ci *
240bf215546Sopenharmony_ci * ----------------------------------------------------------------------
241bf215546Sopenharmony_ci */
242bf215546Sopenharmony_ci
243bf215546Sopenharmony_ciHRESULT APIENTRY
244bf215546Sopenharmony_ci_SetResourcePriority( DXGI_DDI_ARG_SETRESOURCEPRIORITY *SetResourcePriority )
245bf215546Sopenharmony_ci{
246bf215546Sopenharmony_ci   LOG_ENTRYPOINT();
247bf215546Sopenharmony_ci
248bf215546Sopenharmony_ci   /* ignore */
249bf215546Sopenharmony_ci
250bf215546Sopenharmony_ci   return S_OK;
251bf215546Sopenharmony_ci}
252bf215546Sopenharmony_ci
253bf215546Sopenharmony_ci
254bf215546Sopenharmony_ci/*
255bf215546Sopenharmony_ci * ----------------------------------------------------------------------
256bf215546Sopenharmony_ci *
257bf215546Sopenharmony_ci * _QueryResourceResidency --
258bf215546Sopenharmony_ci *
259bf215546Sopenharmony_ci * ----------------------------------------------------------------------
260bf215546Sopenharmony_ci */
261bf215546Sopenharmony_ci
262bf215546Sopenharmony_ciHRESULT APIENTRY
263bf215546Sopenharmony_ci_QueryResourceResidency( DXGI_DDI_ARG_QUERYRESOURCERESIDENCY *QueryResourceResidency )
264bf215546Sopenharmony_ci{
265bf215546Sopenharmony_ci   LOG_ENTRYPOINT();
266bf215546Sopenharmony_ci
267bf215546Sopenharmony_ci   for (UINT i = 0; i < QueryResourceResidency->Resources; ++i) {
268bf215546Sopenharmony_ci      QueryResourceResidency->pStatus[i] = DXGI_DDI_RESIDENCY_FULLY_RESIDENT;
269bf215546Sopenharmony_ci   }
270bf215546Sopenharmony_ci
271bf215546Sopenharmony_ci   return S_OK;
272bf215546Sopenharmony_ci}
273bf215546Sopenharmony_ci
274bf215546Sopenharmony_ci
275bf215546Sopenharmony_ci/*
276bf215546Sopenharmony_ci * ----------------------------------------------------------------------
277bf215546Sopenharmony_ci *
278bf215546Sopenharmony_ci * _RotateResourceIdentities --
279bf215546Sopenharmony_ci *
280bf215546Sopenharmony_ci *    Rotate a list of resources by recreating their views with
281bf215546Sopenharmony_ci *    the updated rotations.
282bf215546Sopenharmony_ci *
283bf215546Sopenharmony_ci * ----------------------------------------------------------------------
284bf215546Sopenharmony_ci */
285bf215546Sopenharmony_ci
286bf215546Sopenharmony_ciHRESULT APIENTRY
287bf215546Sopenharmony_ci_RotateResourceIdentities( DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES *RotateResourceIdentities )
288bf215546Sopenharmony_ci{
289bf215546Sopenharmony_ci   LOG_ENTRYPOINT();
290bf215546Sopenharmony_ci
291bf215546Sopenharmony_ci   if (RotateResourceIdentities->Resources <= 1) {
292bf215546Sopenharmony_ci      return S_OK;
293bf215546Sopenharmony_ci   }
294bf215546Sopenharmony_ci
295bf215546Sopenharmony_ci   struct pipe_context *pipe = CastPipeDevice(RotateResourceIdentities->hDevice);
296bf215546Sopenharmony_ci   struct pipe_screen *screen = pipe->screen;
297bf215546Sopenharmony_ci
298bf215546Sopenharmony_ci   struct pipe_resource *resource0 = CastPipeResource(RotateResourceIdentities->pResources[0]);
299bf215546Sopenharmony_ci
300bf215546Sopenharmony_ci   assert(resource0);
301bf215546Sopenharmony_ci   LOG_UNSUPPORTED(resource0->last_level);
302bf215546Sopenharmony_ci
303bf215546Sopenharmony_ci   /*
304bf215546Sopenharmony_ci    * XXX: Copying is not very efficient, but it is much simpler than the
305bf215546Sopenharmony_ci    * alternative of recreating all views.
306bf215546Sopenharmony_ci    */
307bf215546Sopenharmony_ci
308bf215546Sopenharmony_ci   struct pipe_resource *temp_resource;
309bf215546Sopenharmony_ci   temp_resource = screen->resource_create(screen, resource0);
310bf215546Sopenharmony_ci   assert(temp_resource);
311bf215546Sopenharmony_ci   if (!temp_resource) {
312bf215546Sopenharmony_ci      return E_OUTOFMEMORY;
313bf215546Sopenharmony_ci   }
314bf215546Sopenharmony_ci
315bf215546Sopenharmony_ci   struct pipe_box src_box;
316bf215546Sopenharmony_ci   src_box.x = 0;
317bf215546Sopenharmony_ci   src_box.y = 0;
318bf215546Sopenharmony_ci   src_box.z = 0;
319bf215546Sopenharmony_ci   src_box.width  = resource0->width0;
320bf215546Sopenharmony_ci   src_box.height = resource0->height0;
321bf215546Sopenharmony_ci   src_box.depth  = resource0->depth0;
322bf215546Sopenharmony_ci
323bf215546Sopenharmony_ci   for (UINT i = 0; i < RotateResourceIdentities->Resources + 1; ++i) {
324bf215546Sopenharmony_ci      struct pipe_resource *src_resource;
325bf215546Sopenharmony_ci      struct pipe_resource *dst_resource;
326bf215546Sopenharmony_ci
327bf215546Sopenharmony_ci      if (i < RotateResourceIdentities->Resources) {
328bf215546Sopenharmony_ci         src_resource = CastPipeResource(RotateResourceIdentities->pResources[i]);
329bf215546Sopenharmony_ci      } else {
330bf215546Sopenharmony_ci         src_resource = temp_resource;
331bf215546Sopenharmony_ci      }
332bf215546Sopenharmony_ci
333bf215546Sopenharmony_ci      if (i > 0) {
334bf215546Sopenharmony_ci         dst_resource = CastPipeResource(RotateResourceIdentities->pResources[i - 1]);
335bf215546Sopenharmony_ci      } else {
336bf215546Sopenharmony_ci         dst_resource = temp_resource;
337bf215546Sopenharmony_ci      }
338bf215546Sopenharmony_ci
339bf215546Sopenharmony_ci      assert(dst_resource);
340bf215546Sopenharmony_ci      assert(src_resource);
341bf215546Sopenharmony_ci
342bf215546Sopenharmony_ci      pipe->resource_copy_region(pipe,
343bf215546Sopenharmony_ci                                 dst_resource,
344bf215546Sopenharmony_ci                                 0, // dst_level
345bf215546Sopenharmony_ci                                 0, 0, 0, // dst_x,y,z
346bf215546Sopenharmony_ci                                 src_resource,
347bf215546Sopenharmony_ci                                 0, // src_level
348bf215546Sopenharmony_ci                                 &src_box);
349bf215546Sopenharmony_ci   }
350bf215546Sopenharmony_ci
351bf215546Sopenharmony_ci   pipe_resource_reference(&temp_resource, NULL);
352bf215546Sopenharmony_ci
353bf215546Sopenharmony_ci   return S_OK;
354bf215546Sopenharmony_ci}
355bf215546Sopenharmony_ci
356bf215546Sopenharmony_ci
357bf215546Sopenharmony_ci/*
358bf215546Sopenharmony_ci * ----------------------------------------------------------------------
359bf215546Sopenharmony_ci *
360bf215546Sopenharmony_ci * _Blt --
361bf215546Sopenharmony_ci *
362bf215546Sopenharmony_ci *    Do a blt between two subresources. Apply MSAA resolve, format
363bf215546Sopenharmony_ci *    conversion and stretching.
364bf215546Sopenharmony_ci *
365bf215546Sopenharmony_ci * ----------------------------------------------------------------------
366bf215546Sopenharmony_ci */
367bf215546Sopenharmony_ci
368bf215546Sopenharmony_ciHRESULT APIENTRY
369bf215546Sopenharmony_ci_Blt(DXGI_DDI_ARG_BLT *Blt)
370bf215546Sopenharmony_ci{
371bf215546Sopenharmony_ci   LOG_UNSUPPORTED_ENTRYPOINT();
372bf215546Sopenharmony_ci
373bf215546Sopenharmony_ci   return S_OK;
374bf215546Sopenharmony_ci}
375