mirror of
https://github.com/elwrcl/intel-hard-graphics.git
synced 2026-11-01 03:18:02 +03:00
263 lines
6.7 KiB
C++
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;
|
|
}
|