Files
intel-hard-graphics/src/gallium/frontends/d3d10umd/DxgiFns.cpp
T
2026-06-06 13:25:15 +03:00

263 lines
6.7 KiB
C++

/**************************************************************************
*
* 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 <stdio.h>
#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->flush(device->pipe, NULL, 0);
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;
}