/************************************************************************** * * Copyright 2012-2021 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * **************************************************************************/ /* * DxgiFns.cpp -- * DXGI related functions. */ #include #include "DxgiFns.h" #include "Format.h" #include "State.h" #include "Debug.h" #include "util/format/u_format.h" /* * ---------------------------------------------------------------------- * * _Present -- * * This is turned into kernel callbacks rather than directly emitted * as fifo packets. * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _Present(DXGI_DDI_ARG_PRESENT *pPresentData) { LOG_ENTRYPOINT(); struct Device *device = CastDevice(pPresentData->hDevice); Resource *pSrcResource = CastResource(pPresentData->hSurfaceToPresent); device->pipe->screen->flush_frontbuffer(device->pipe->screen, device->pipe, pSrcResource->resource, 0, 0, pPresentData->pDXGIContext, 0, NULL); return S_OK; } /* * ---------------------------------------------------------------------- * * _GetGammaCaps -- * * Return gamma capabilities. * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _GetGammaCaps( DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS *GetCaps ) { LOG_ENTRYPOINT(); DXGI_GAMMA_CONTROL_CAPABILITIES *pCaps; pCaps = GetCaps->pGammaCapabilities; pCaps->ScaleAndOffsetSupported = false; pCaps->MinConvertedValue = 0.0; pCaps->MaxConvertedValue = 1.0; pCaps->NumGammaControlPoints = 17; for (UINT i = 0; i < pCaps->NumGammaControlPoints; i++) { pCaps->ControlPointPositions[i] = (float)i / (float)(pCaps->NumGammaControlPoints - 1); } return S_OK; } /* * ---------------------------------------------------------------------- * * _SetDisplayMode -- * * Set the resource that is used to scan out to the display. * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _SetDisplayMode( DXGI_DDI_ARG_SETDISPLAYMODE *SetDisplayMode ) { LOG_UNSUPPORTED_ENTRYPOINT(); return S_OK; } /* * ---------------------------------------------------------------------- * * _SetResourcePriority -- * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _SetResourcePriority( DXGI_DDI_ARG_SETRESOURCEPRIORITY *SetResourcePriority ) { LOG_ENTRYPOINT(); /* ignore */ return S_OK; } /* * ---------------------------------------------------------------------- * * _QueryResourceResidency -- * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _QueryResourceResidency( DXGI_DDI_ARG_QUERYRESOURCERESIDENCY *QueryResourceResidency ) { LOG_ENTRYPOINT(); for (UINT i = 0; i < QueryResourceResidency->Resources; ++i) { QueryResourceResidency->pStatus[i] = DXGI_DDI_RESIDENCY_FULLY_RESIDENT; } return S_OK; } /* * ---------------------------------------------------------------------- * * _RotateResourceIdentities -- * * Rotate a list of resources by recreating their views with * the updated rotations. * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _RotateResourceIdentities( DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES *RotateResourceIdentities ) { LOG_ENTRYPOINT(); if (RotateResourceIdentities->Resources <= 1) { return S_OK; } struct pipe_context *pipe = CastPipeDevice(RotateResourceIdentities->hDevice); struct pipe_screen *screen = pipe->screen; struct pipe_resource *resource0 = CastPipeResource(RotateResourceIdentities->pResources[0]); assert(resource0); LOG_UNSUPPORTED(resource0->last_level); /* * XXX: Copying is not very efficient, but it is much simpler than the * alternative of recreating all views. */ struct pipe_resource *temp_resource; temp_resource = screen->resource_create(screen, resource0); assert(temp_resource); if (!temp_resource) { return E_OUTOFMEMORY; } struct pipe_box src_box; src_box.x = 0; src_box.y = 0; src_box.z = 0; src_box.width = resource0->width0; src_box.height = resource0->height0; src_box.depth = resource0->depth0; for (UINT i = 0; i < RotateResourceIdentities->Resources + 1; ++i) { struct pipe_resource *src_resource; struct pipe_resource *dst_resource; if (i < RotateResourceIdentities->Resources) { src_resource = CastPipeResource(RotateResourceIdentities->pResources[i]); } else { src_resource = temp_resource; } if (i > 0) { dst_resource = CastPipeResource(RotateResourceIdentities->pResources[i - 1]); } else { dst_resource = temp_resource; } assert(dst_resource); assert(src_resource); pipe->resource_copy_region(pipe, dst_resource, 0, // dst_level 0, 0, 0, // dst_x,y,z src_resource, 0, // src_level &src_box); } pipe_resource_reference(&temp_resource, NULL); return S_OK; } /* * ---------------------------------------------------------------------- * * _Blt -- * * Do a blt between two subresources. Apply MSAA resolve, format * conversion and stretching. * * ---------------------------------------------------------------------- */ HRESULT APIENTRY _Blt(DXGI_DDI_ARG_BLT *Blt) { LOG_UNSUPPORTED_ENTRYPOINT(); return S_OK; }