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