mesa/src/gallium/frontends/d3d10umd/Device.cpp

726 lines
31 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.
*
**************************************************************************/
/*
* Device.cpp --
* Functions that provide the 3D device functionality.
*/
#include "Draw.h"
#include "Dxgi.h"
#include "InputAssembly.h"
#include "OutputMerger.h"
#include "Query.h"
#include "Rasterizer.h"
#include "Resource.h"
#include "Shader.h"
#include "State.h"
#include "Format.h"
#include "Debug.h"
#include "util/u_sampler.h"
static void APIENTRY DestroyDevice(D3D10DDI_HDEVICE hDevice);
static void APIENTRY RelocateDeviceFuncs(D3D10DDI_HDEVICE hDevice,
__in struct D3D10DDI_DEVICEFUNCS *pDeviceFunctions);
static void APIENTRY RelocateDeviceFuncs1(D3D10DDI_HDEVICE hDevice,
__in struct D3D10_1DDI_DEVICEFUNCS *pDeviceFunctions);
static void APIENTRY Flush(D3D10DDI_HDEVICE hDevice);
static void APIENTRY CheckFormatSupport(D3D10DDI_HDEVICE hDevice, DXGI_FORMAT Format,
__out UINT *pFormatCaps);
static void APIENTRY CheckMultisampleQualityLevels(D3D10DDI_HDEVICE hDevice,
DXGI_FORMAT Format,
UINT SampleCount,
__out UINT *pNumQualityLevels);
static void APIENTRY SetTextFilterSize(D3D10DDI_HDEVICE hDevice, UINT Width, UINT Height);
/*
* ----------------------------------------------------------------------
*
* CalcPrivateDeviceSize --
*
* The CalcPrivateDeviceSize function determines the size of a memory
* region that the user-mode display driver requires from the Microsoft
* Direct3D runtime to store frequently-accessed data.
*
* ----------------------------------------------------------------------
*/
SIZE_T APIENTRY
CalcPrivateDeviceSize(D3D10DDI_HADAPTER hAdapter, // IN
__in const D3D10DDIARG_CALCPRIVATEDEVICESIZE *pData) // IN
{
return sizeof(Device);
}
/*
* ----------------------------------------------------------------------
*
* CreateDevice --
*
* The CreateDevice function creates a graphics context that is
* referenced in subsequent calls.
*
* ----------------------------------------------------------------------
*/
HRESULT APIENTRY
CreateDevice(D3D10DDI_HADAPTER hAdapter, // IN
__in D3D10DDIARG_CREATEDEVICE *pCreateData) // IN
{
LOG_ENTRYPOINT();
if (0) {
DebugPrintf("hAdapter = %p\n", hAdapter);
DebugPrintf("pKTCallbacks = %p\n", pCreateData->pKTCallbacks);
DebugPrintf("p10_1DeviceFuncs = %p\n", pCreateData->p10_1DeviceFuncs);
DebugPrintf("hDrvDevice = %p\n", pCreateData->hDrvDevice);
DebugPrintf("DXGIBaseDDI = %p\n", pCreateData->DXGIBaseDDI);
DebugPrintf("hRTCoreLayer = %p\n", pCreateData->hRTCoreLayer);
DebugPrintf("pUMCallbacks = %p\n", pCreateData->pUMCallbacks);
}
switch (pCreateData->Interface) {
case D3D10_0_DDI_INTERFACE_VERSION:
case D3D10_0_x_DDI_INTERFACE_VERSION:
case D3D10_0_7_DDI_INTERFACE_VERSION:
#if SUPPORT_D3D10_1
case D3D10_1_DDI_INTERFACE_VERSION:
case D3D10_1_x_DDI_INTERFACE_VERSION:
case D3D10_1_7_DDI_INTERFACE_VERSION:
#endif
break;
default:
DebugPrintf("%s: unsupported interface version 0x%08x\n",
__FUNCTION__, pCreateData->Interface);
return E_FAIL;
}
Adapter *pAdapter = CastAdapter(hAdapter);
Device *pDevice = CastDevice(pCreateData->hDrvDevice);
memset(pDevice, 0, sizeof *pDevice);
struct pipe_screen *screen = pAdapter->screen;
struct pipe_context *pipe = screen->context_create(screen, NULL, 0);
pDevice->pipe = pipe;
pDevice->empty_vs = CreateEmptyShader(pDevice, PIPE_SHADER_VERTEX);
pDevice->empty_fs = CreateEmptyShader(pDevice, PIPE_SHADER_FRAGMENT);
pipe->bind_vs_state(pipe, pDevice->empty_vs);
pipe->bind_fs_state(pipe, pDevice->empty_fs);
pDevice->max_dual_source_render_targets =
screen->get_param(screen, PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS);
pDevice->hRTCoreLayer = pCreateData->hRTCoreLayer;
pDevice->hDevice = (HANDLE)pCreateData->hRTDevice.handle;
pDevice->KTCallbacks = *pCreateData->pKTCallbacks;
pDevice->UMCallbacks = *pCreateData->pUMCallbacks;
pDevice->pDXGIBaseCallbacks = pCreateData->DXGIBaseDDI.pDXGIBaseCallbacks;
pDevice->draw_so_target = NULL;
if (0) {
DebugPrintf("pDevice = %p\n", pDevice);
}
st_debug_parse();
/*
* Fill in the D3D10 DDI functions
*/
switch (pCreateData->Interface) {
case D3D10_0_DDI_INTERFACE_VERSION:
case D3D10_0_x_DDI_INTERFACE_VERSION:
case D3D10_0_7_DDI_INTERFACE_VERSION:
pCreateData->pDeviceFuncs->pfnDefaultConstantBufferUpdateSubresourceUP =
ResourceUpdateSubResourceUP;
pCreateData->pDeviceFuncs->pfnVsSetConstantBuffers = VsSetConstantBuffers;
pCreateData->pDeviceFuncs->pfnPsSetShaderResources = PsSetShaderResources;
pCreateData->pDeviceFuncs->pfnPsSetShader = PsSetShader;
pCreateData->pDeviceFuncs->pfnPsSetSamplers = PsSetSamplers;
pCreateData->pDeviceFuncs->pfnVsSetShader = VsSetShader;
pCreateData->pDeviceFuncs->pfnDrawIndexed = DrawIndexed;
pCreateData->pDeviceFuncs->pfnDraw = Draw;
pCreateData->pDeviceFuncs->pfnDynamicIABufferMapNoOverwrite =
ResourceMap;
pCreateData->pDeviceFuncs->pfnDynamicIABufferUnmap = ResourceUnmap;
pCreateData->pDeviceFuncs->pfnDynamicConstantBufferMapDiscard =
ResourceMap;
pCreateData->pDeviceFuncs->pfnDynamicIABufferMapDiscard =
ResourceMap;
pCreateData->pDeviceFuncs->pfnDynamicConstantBufferUnmap =
ResourceUnmap;
pCreateData->pDeviceFuncs->pfnPsSetConstantBuffers = PsSetConstantBuffers;
pCreateData->pDeviceFuncs->pfnIaSetInputLayout = IaSetInputLayout;
pCreateData->pDeviceFuncs->pfnIaSetVertexBuffers = IaSetVertexBuffers;
pCreateData->pDeviceFuncs->pfnIaSetIndexBuffer = IaSetIndexBuffer;
pCreateData->pDeviceFuncs->pfnDrawIndexedInstanced = DrawIndexedInstanced;
pCreateData->pDeviceFuncs->pfnDrawInstanced = DrawInstanced;
pCreateData->pDeviceFuncs->pfnDynamicResourceMapDiscard =
ResourceMap;
pCreateData->pDeviceFuncs->pfnDynamicResourceUnmap = ResourceUnmap;
pCreateData->pDeviceFuncs->pfnGsSetConstantBuffers = GsSetConstantBuffers;
pCreateData->pDeviceFuncs->pfnGsSetShader = GsSetShader;
pCreateData->pDeviceFuncs->pfnIaSetTopology = IaSetTopology;
pCreateData->pDeviceFuncs->pfnStagingResourceMap = ResourceMap;
pCreateData->pDeviceFuncs->pfnStagingResourceUnmap = ResourceUnmap;
pCreateData->pDeviceFuncs->pfnVsSetShaderResources = VsSetShaderResources;
pCreateData->pDeviceFuncs->pfnVsSetSamplers = VsSetSamplers;
pCreateData->pDeviceFuncs->pfnGsSetShaderResources = GsSetShaderResources;
pCreateData->pDeviceFuncs->pfnGsSetSamplers = GsSetSamplers;
pCreateData->pDeviceFuncs->pfnSetRenderTargets = SetRenderTargets;
pCreateData->pDeviceFuncs->pfnShaderResourceViewReadAfterWriteHazard =
ShaderResourceViewReadAfterWriteHazard;
pCreateData->pDeviceFuncs->pfnResourceReadAfterWriteHazard =
ResourceReadAfterWriteHazard;
pCreateData->pDeviceFuncs->pfnSetBlendState = SetBlendState;
pCreateData->pDeviceFuncs->pfnSetDepthStencilState = SetDepthStencilState;
pCreateData->pDeviceFuncs->pfnSetRasterizerState = SetRasterizerState;
pCreateData->pDeviceFuncs->pfnQueryEnd = QueryEnd;
pCreateData->pDeviceFuncs->pfnQueryBegin = QueryBegin;
pCreateData->pDeviceFuncs->pfnResourceCopyRegion = ResourceCopyRegion;
pCreateData->pDeviceFuncs->pfnResourceUpdateSubresourceUP =
ResourceUpdateSubResourceUP;
pCreateData->pDeviceFuncs->pfnSoSetTargets = SoSetTargets;
pCreateData->pDeviceFuncs->pfnDrawAuto = DrawAuto;
pCreateData->pDeviceFuncs->pfnSetViewports = SetViewports;
pCreateData->pDeviceFuncs->pfnSetScissorRects = SetScissorRects;
pCreateData->pDeviceFuncs->pfnClearRenderTargetView = ClearRenderTargetView;
pCreateData->pDeviceFuncs->pfnClearDepthStencilView = ClearDepthStencilView;
pCreateData->pDeviceFuncs->pfnSetPredication = SetPredication;
pCreateData->pDeviceFuncs->pfnQueryGetData = QueryGetData;
pCreateData->pDeviceFuncs->pfnFlush = Flush;
pCreateData->pDeviceFuncs->pfnGenMips = GenMips;
pCreateData->pDeviceFuncs->pfnResourceCopy = ResourceCopy;
pCreateData->pDeviceFuncs->pfnResourceResolveSubresource =
ResourceResolveSubResource;
pCreateData->pDeviceFuncs->pfnResourceMap = ResourceMap;
pCreateData->pDeviceFuncs->pfnResourceUnmap = ResourceUnmap;
pCreateData->pDeviceFuncs->pfnResourceIsStagingBusy = ResourceIsStagingBusy;
pCreateData->pDeviceFuncs->pfnRelocateDeviceFuncs = RelocateDeviceFuncs;
pCreateData->pDeviceFuncs->pfnCalcPrivateResourceSize =
CalcPrivateResourceSize;
pCreateData->pDeviceFuncs->pfnCalcPrivateOpenedResourceSize =
CalcPrivateOpenedResourceSize;
pCreateData->pDeviceFuncs->pfnCreateResource = CreateResource;
pCreateData->pDeviceFuncs->pfnOpenResource = OpenResource;
pCreateData->pDeviceFuncs->pfnDestroyResource = DestroyResource;
pCreateData->pDeviceFuncs->pfnCalcPrivateShaderResourceViewSize =
CalcPrivateShaderResourceViewSize;
pCreateData->pDeviceFuncs->pfnCreateShaderResourceView =
CreateShaderResourceView;
pCreateData->pDeviceFuncs->pfnDestroyShaderResourceView =
DestroyShaderResourceView;
pCreateData->pDeviceFuncs->pfnCalcPrivateRenderTargetViewSize =
CalcPrivateRenderTargetViewSize;
pCreateData->pDeviceFuncs->pfnCreateRenderTargetView =
CreateRenderTargetView;
pCreateData->pDeviceFuncs->pfnDestroyRenderTargetView =
DestroyRenderTargetView;
pCreateData->pDeviceFuncs->pfnCalcPrivateDepthStencilViewSize =
CalcPrivateDepthStencilViewSize;
pCreateData->pDeviceFuncs->pfnCreateDepthStencilView =
CreateDepthStencilView;
pCreateData->pDeviceFuncs->pfnDestroyDepthStencilView =
DestroyDepthStencilView;
pCreateData->pDeviceFuncs->pfnCalcPrivateElementLayoutSize =
CalcPrivateElementLayoutSize;
pCreateData->pDeviceFuncs->pfnCreateElementLayout = CreateElementLayout;
pCreateData->pDeviceFuncs->pfnDestroyElementLayout = DestroyElementLayout;
pCreateData->pDeviceFuncs->pfnCalcPrivateBlendStateSize =
CalcPrivateBlendStateSize;
pCreateData->pDeviceFuncs->pfnCreateBlendState = CreateBlendState;
pCreateData->pDeviceFuncs->pfnDestroyBlendState = DestroyBlendState;
pCreateData->pDeviceFuncs->pfnCalcPrivateDepthStencilStateSize =
CalcPrivateDepthStencilStateSize;
pCreateData->pDeviceFuncs->pfnCreateDepthStencilState =
CreateDepthStencilState;
pCreateData->pDeviceFuncs->pfnDestroyDepthStencilState =
DestroyDepthStencilState;
pCreateData->pDeviceFuncs->pfnCalcPrivateRasterizerStateSize =
CalcPrivateRasterizerStateSize;
pCreateData->pDeviceFuncs->pfnCreateRasterizerState =
CreateRasterizerState;
pCreateData->pDeviceFuncs->pfnDestroyRasterizerState =
DestroyRasterizerState;
pCreateData->pDeviceFuncs->pfnCalcPrivateShaderSize = CalcPrivateShaderSize;
pCreateData->pDeviceFuncs->pfnCreateVertexShader = CreateVertexShader;
pCreateData->pDeviceFuncs->pfnCreateGeometryShader = CreateGeometryShader;
pCreateData->pDeviceFuncs->pfnCreatePixelShader = CreatePixelShader;
pCreateData->pDeviceFuncs->pfnCalcPrivateGeometryShaderWithStreamOutput =
CalcPrivateGeometryShaderWithStreamOutput;
pCreateData->pDeviceFuncs->pfnCreateGeometryShaderWithStreamOutput =
CreateGeometryShaderWithStreamOutput;
pCreateData->pDeviceFuncs->pfnDestroyShader = DestroyShader;
pCreateData->pDeviceFuncs->pfnCalcPrivateSamplerSize = CalcPrivateSamplerSize;
pCreateData->pDeviceFuncs->pfnCreateSampler = CreateSampler;
pCreateData->pDeviceFuncs->pfnDestroySampler = DestroySampler;
pCreateData->pDeviceFuncs->pfnCalcPrivateQuerySize = CalcPrivateQuerySize;
pCreateData->pDeviceFuncs->pfnCreateQuery = CreateQuery;
pCreateData->pDeviceFuncs->pfnDestroyQuery = DestroyQuery;
pCreateData->pDeviceFuncs->pfnCheckFormatSupport = CheckFormatSupport;
pCreateData->pDeviceFuncs->pfnCheckMultisampleQualityLevels =
CheckMultisampleQualityLevels;
pCreateData->pDeviceFuncs->pfnCheckCounterInfo = CheckCounterInfo;
pCreateData->pDeviceFuncs->pfnCheckCounter = CheckCounter;
pCreateData->pDeviceFuncs->pfnDestroyDevice = DestroyDevice;
pCreateData->pDeviceFuncs->pfnSetTextFilterSize = SetTextFilterSize;
break;
case D3D10_1_DDI_INTERFACE_VERSION:
case D3D10_1_x_DDI_INTERFACE_VERSION:
case D3D10_1_7_DDI_INTERFACE_VERSION:
pCreateData->p10_1DeviceFuncs->pfnDefaultConstantBufferUpdateSubresourceUP =
ResourceUpdateSubResourceUP;
pCreateData->p10_1DeviceFuncs->pfnVsSetConstantBuffers = VsSetConstantBuffers;
pCreateData->p10_1DeviceFuncs->pfnPsSetShaderResources = PsSetShaderResources;
pCreateData->p10_1DeviceFuncs->pfnPsSetShader = PsSetShader;
pCreateData->p10_1DeviceFuncs->pfnPsSetSamplers = PsSetSamplers;
pCreateData->p10_1DeviceFuncs->pfnVsSetShader = VsSetShader;
pCreateData->p10_1DeviceFuncs->pfnDrawIndexed = DrawIndexed;
pCreateData->p10_1DeviceFuncs->pfnDraw = Draw;
pCreateData->p10_1DeviceFuncs->pfnDynamicIABufferMapNoOverwrite =
ResourceMap;
pCreateData->p10_1DeviceFuncs->pfnDynamicIABufferUnmap = ResourceUnmap;
pCreateData->p10_1DeviceFuncs->pfnDynamicConstantBufferMapDiscard =
ResourceMap;
pCreateData->p10_1DeviceFuncs->pfnDynamicIABufferMapDiscard =
ResourceMap;
pCreateData->p10_1DeviceFuncs->pfnDynamicConstantBufferUnmap =
ResourceUnmap;
pCreateData->p10_1DeviceFuncs->pfnPsSetConstantBuffers = PsSetConstantBuffers;
pCreateData->p10_1DeviceFuncs->pfnIaSetInputLayout = IaSetInputLayout;
pCreateData->p10_1DeviceFuncs->pfnIaSetVertexBuffers = IaSetVertexBuffers;
pCreateData->p10_1DeviceFuncs->pfnIaSetIndexBuffer = IaSetIndexBuffer;
pCreateData->p10_1DeviceFuncs->pfnDrawIndexedInstanced = DrawIndexedInstanced;
pCreateData->p10_1DeviceFuncs->pfnDrawInstanced = DrawInstanced;
pCreateData->p10_1DeviceFuncs->pfnDynamicResourceMapDiscard =
ResourceMap;
pCreateData->p10_1DeviceFuncs->pfnDynamicResourceUnmap = ResourceUnmap;
pCreateData->p10_1DeviceFuncs->pfnGsSetConstantBuffers = GsSetConstantBuffers;
pCreateData->p10_1DeviceFuncs->pfnGsSetShader = GsSetShader;
pCreateData->p10_1DeviceFuncs->pfnIaSetTopology = IaSetTopology;
pCreateData->p10_1DeviceFuncs->pfnStagingResourceMap = ResourceMap;
pCreateData->p10_1DeviceFuncs->pfnStagingResourceUnmap = ResourceUnmap;
pCreateData->p10_1DeviceFuncs->pfnVsSetShaderResources = VsSetShaderResources;
pCreateData->p10_1DeviceFuncs->pfnVsSetSamplers = VsSetSamplers;
pCreateData->p10_1DeviceFuncs->pfnGsSetShaderResources = GsSetShaderResources;
pCreateData->p10_1DeviceFuncs->pfnGsSetSamplers = GsSetSamplers;
pCreateData->p10_1DeviceFuncs->pfnSetRenderTargets = SetRenderTargets;
pCreateData->p10_1DeviceFuncs->pfnShaderResourceViewReadAfterWriteHazard =
ShaderResourceViewReadAfterWriteHazard;
pCreateData->p10_1DeviceFuncs->pfnResourceReadAfterWriteHazard =
ResourceReadAfterWriteHazard;
pCreateData->p10_1DeviceFuncs->pfnSetBlendState = SetBlendState;
pCreateData->p10_1DeviceFuncs->pfnSetDepthStencilState = SetDepthStencilState;
pCreateData->p10_1DeviceFuncs->pfnSetRasterizerState = SetRasterizerState;
pCreateData->p10_1DeviceFuncs->pfnQueryEnd = QueryEnd;
pCreateData->p10_1DeviceFuncs->pfnQueryBegin = QueryBegin;
pCreateData->p10_1DeviceFuncs->pfnResourceCopyRegion = ResourceCopyRegion;
pCreateData->p10_1DeviceFuncs->pfnResourceUpdateSubresourceUP =
ResourceUpdateSubResourceUP;
pCreateData->p10_1DeviceFuncs->pfnSoSetTargets = SoSetTargets;
pCreateData->p10_1DeviceFuncs->pfnDrawAuto = DrawAuto;
pCreateData->p10_1DeviceFuncs->pfnSetViewports = SetViewports;
pCreateData->p10_1DeviceFuncs->pfnSetScissorRects = SetScissorRects;
pCreateData->p10_1DeviceFuncs->pfnClearRenderTargetView = ClearRenderTargetView;
pCreateData->p10_1DeviceFuncs->pfnClearDepthStencilView = ClearDepthStencilView;
pCreateData->p10_1DeviceFuncs->pfnSetPredication = SetPredication;
pCreateData->p10_1DeviceFuncs->pfnQueryGetData = QueryGetData;
pCreateData->p10_1DeviceFuncs->pfnFlush = Flush;
pCreateData->p10_1DeviceFuncs->pfnGenMips = GenMips;
pCreateData->p10_1DeviceFuncs->pfnResourceCopy = ResourceCopy;
pCreateData->p10_1DeviceFuncs->pfnResourceResolveSubresource =
ResourceResolveSubResource;
pCreateData->p10_1DeviceFuncs->pfnResourceMap = ResourceMap;
pCreateData->p10_1DeviceFuncs->pfnResourceUnmap = ResourceUnmap;
pCreateData->p10_1DeviceFuncs->pfnResourceIsStagingBusy = ResourceIsStagingBusy;
pCreateData->p10_1DeviceFuncs->pfnRelocateDeviceFuncs = RelocateDeviceFuncs1;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateResourceSize =
CalcPrivateResourceSize;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateOpenedResourceSize =
CalcPrivateOpenedResourceSize;
pCreateData->p10_1DeviceFuncs->pfnCreateResource = CreateResource;
pCreateData->p10_1DeviceFuncs->pfnOpenResource = OpenResource;
pCreateData->p10_1DeviceFuncs->pfnDestroyResource = DestroyResource;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateShaderResourceViewSize =
CalcPrivateShaderResourceViewSize1;
pCreateData->p10_1DeviceFuncs->pfnCreateShaderResourceView =
CreateShaderResourceView1;
pCreateData->p10_1DeviceFuncs->pfnDestroyShaderResourceView =
DestroyShaderResourceView;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateRenderTargetViewSize =
CalcPrivateRenderTargetViewSize;
pCreateData->p10_1DeviceFuncs->pfnCreateRenderTargetView =
CreateRenderTargetView;
pCreateData->p10_1DeviceFuncs->pfnDestroyRenderTargetView =
DestroyRenderTargetView;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateDepthStencilViewSize =
CalcPrivateDepthStencilViewSize;
pCreateData->p10_1DeviceFuncs->pfnCreateDepthStencilView =
CreateDepthStencilView;
pCreateData->p10_1DeviceFuncs->pfnDestroyDepthStencilView =
DestroyDepthStencilView;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateElementLayoutSize =
CalcPrivateElementLayoutSize;
pCreateData->p10_1DeviceFuncs->pfnCreateElementLayout = CreateElementLayout;
pCreateData->p10_1DeviceFuncs->pfnDestroyElementLayout = DestroyElementLayout;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateBlendStateSize =
CalcPrivateBlendStateSize1;
pCreateData->p10_1DeviceFuncs->pfnCreateBlendState = CreateBlendState1;
pCreateData->p10_1DeviceFuncs->pfnDestroyBlendState = DestroyBlendState;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateDepthStencilStateSize =
CalcPrivateDepthStencilStateSize;
pCreateData->p10_1DeviceFuncs->pfnCreateDepthStencilState =
CreateDepthStencilState;
pCreateData->p10_1DeviceFuncs->pfnDestroyDepthStencilState =
DestroyDepthStencilState;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateRasterizerStateSize =
CalcPrivateRasterizerStateSize;
pCreateData->p10_1DeviceFuncs->pfnCreateRasterizerState =
CreateRasterizerState;
pCreateData->p10_1DeviceFuncs->pfnDestroyRasterizerState =
DestroyRasterizerState;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateShaderSize = CalcPrivateShaderSize;
pCreateData->p10_1DeviceFuncs->pfnCreateVertexShader = CreateVertexShader;
pCreateData->p10_1DeviceFuncs->pfnCreateGeometryShader = CreateGeometryShader;
pCreateData->p10_1DeviceFuncs->pfnCreatePixelShader = CreatePixelShader;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateGeometryShaderWithStreamOutput =
CalcPrivateGeometryShaderWithStreamOutput;
pCreateData->p10_1DeviceFuncs->pfnCreateGeometryShaderWithStreamOutput =
CreateGeometryShaderWithStreamOutput;
pCreateData->p10_1DeviceFuncs->pfnDestroyShader = DestroyShader;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateSamplerSize = CalcPrivateSamplerSize;
pCreateData->p10_1DeviceFuncs->pfnCreateSampler = CreateSampler;
pCreateData->p10_1DeviceFuncs->pfnDestroySampler = DestroySampler;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateQuerySize = CalcPrivateQuerySize;
pCreateData->p10_1DeviceFuncs->pfnCreateQuery = CreateQuery;
pCreateData->p10_1DeviceFuncs->pfnDestroyQuery = DestroyQuery;
pCreateData->p10_1DeviceFuncs->pfnCheckFormatSupport = CheckFormatSupport;
pCreateData->p10_1DeviceFuncs->pfnCheckMultisampleQualityLevels =
CheckMultisampleQualityLevels;
pCreateData->p10_1DeviceFuncs->pfnCheckCounterInfo = CheckCounterInfo;
pCreateData->p10_1DeviceFuncs->pfnCheckCounter = CheckCounter;
pCreateData->p10_1DeviceFuncs->pfnDestroyDevice = DestroyDevice;
pCreateData->p10_1DeviceFuncs->pfnSetTextFilterSize = SetTextFilterSize;
pCreateData->p10_1DeviceFuncs->pfnRelocateDeviceFuncs = RelocateDeviceFuncs1;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateShaderResourceViewSize =
CalcPrivateShaderResourceViewSize1;
pCreateData->p10_1DeviceFuncs->pfnCreateShaderResourceView =
CreateShaderResourceView1;
pCreateData->p10_1DeviceFuncs->pfnCalcPrivateBlendStateSize =
CalcPrivateBlendStateSize1;
pCreateData->p10_1DeviceFuncs->pfnCreateBlendState = CreateBlendState1;
pCreateData->p10_1DeviceFuncs->pfnResourceConvert =
pCreateData->p10_1DeviceFuncs->pfnResourceCopy;
pCreateData->p10_1DeviceFuncs->pfnResourceConvertRegion =
pCreateData->p10_1DeviceFuncs->pfnResourceCopyRegion;
break;
default:
assert(0);
break;
}
/*
* Fill in DXGI DDI functions
*/
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnPresent =
_Present;
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnGetGammaCaps =
_GetGammaCaps;
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnSetDisplayMode =
_SetDisplayMode;
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnSetResourcePriority =
_SetResourcePriority;
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnQueryResourceResidency =
_QueryResourceResidency;
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnRotateResourceIdentities =
_RotateResourceIdentities;
pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions->pfnBlt =
_Blt;
if (0) {
return S_OK;
} else {
// Tell DXGI to not use the shared resource presentation path when
// communicating with DWM:
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff569887(v=vs.85).aspx
return DXGI_STATUS_NO_REDIRECTION;
}
}
/*
* ----------------------------------------------------------------------
*
* DestroyDevice --
*
* The DestroyDevice function destroys a graphics context.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
DestroyDevice(D3D10DDI_HDEVICE hDevice) // IN
{
unsigned i;
LOG_ENTRYPOINT();
Device *pDevice = CastDevice(hDevice);
struct pipe_context *pipe = pDevice->pipe;
pipe->flush(pipe, NULL, 0);
for (i = 0; i < PIPE_MAX_SO_BUFFERS; ++i) {
pipe_so_target_reference(&pDevice->so_targets[i], NULL);
}
if (pDevice->draw_so_target) {
pipe_so_target_reference(&pDevice->draw_so_target, NULL);
}
pipe->bind_fs_state(pipe, NULL);
pipe->bind_vs_state(pipe, NULL);
DeleteEmptyShader(pDevice, PIPE_SHADER_FRAGMENT, pDevice->empty_fs);
DeleteEmptyShader(pDevice, PIPE_SHADER_VERTEX, pDevice->empty_vs);
pipe_surface_reference(&pDevice->fb.zsbuf, NULL);
for (i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) {
pipe_surface_reference(&pDevice->fb.cbufs[i], NULL);
}
for (i = 0; i < PIPE_MAX_ATTRIBS; ++i) {
if (!pDevice->vertex_buffers[i].is_user_buffer) {
pipe_resource_reference(&pDevice->vertex_buffers[i].buffer.resource, NULL);
}
}
pipe_resource_reference(&pDevice->index_buffer, NULL);
static struct pipe_sampler_view * sampler_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
memset(sampler_views, 0, sizeof sampler_views);
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
PIPE_MAX_SHADER_SAMPLER_VIEWS, 0, sampler_views);
pipe->set_sampler_views(pipe, PIPE_SHADER_VERTEX, 0,
PIPE_MAX_SHADER_SAMPLER_VIEWS, 0, sampler_views);
pipe->set_sampler_views(pipe, PIPE_SHADER_GEOMETRY, 0,
PIPE_MAX_SHADER_SAMPLER_VIEWS, 0, sampler_views);
pipe->destroy(pipe);
}
/*
* ----------------------------------------------------------------------
*
* RelocateDeviceFuncs --
*
* The RelocateDeviceFuncs function notifies the user-mode
* display driver about the new location of the driver function table.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
RelocateDeviceFuncs(D3D10DDI_HDEVICE hDevice, // IN
__in struct D3D10DDI_DEVICEFUNCS *pDeviceFunctions) // IN
{
LOG_ENTRYPOINT();
/*
* Nothing to do as we don't store a pointer to this entity.
*/
}
/*
* ----------------------------------------------------------------------
*
* RelocateDeviceFuncs1 --
*
* The RelocateDeviceFuncs function notifies the user-mode
* display driver about the new location of the driver function table.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
RelocateDeviceFuncs1(D3D10DDI_HDEVICE hDevice, // IN
__in struct D3D10_1DDI_DEVICEFUNCS *pDeviceFunctions) // IN
{
LOG_ENTRYPOINT();
/*
* Nothing to do as we don't store a pointer to this entity.
*/
}
/*
* ----------------------------------------------------------------------
*
* Flush --
*
* The Flush function submits outstanding hardware commands that
* are in the hardware command buffer to the display miniport driver.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
Flush(D3D10DDI_HDEVICE hDevice) // IN
{
LOG_ENTRYPOINT();
struct pipe_context *pipe = CastPipeContext(hDevice);
pipe->flush(pipe, NULL, 0);
}
/*
* ----------------------------------------------------------------------
*
* CheckFormatSupport --
*
* The CheckFormatSupport function retrieves the capabilites that
* the device has with the specified format.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
CheckFormatSupport(D3D10DDI_HDEVICE hDevice, // IN
DXGI_FORMAT Format, // IN
__out UINT *pFormatCaps) // OUT
{
//LOG_ENTRYPOINT();
struct pipe_context *pipe = CastPipeContext(hDevice);
struct pipe_screen *screen = pipe->screen;
*pFormatCaps = 0;
enum pipe_format format = FormatTranslate(Format, FALSE);
if (format == PIPE_FORMAT_NONE) {
*pFormatCaps = D3D10_DDI_FORMAT_SUPPORT_NOT_SUPPORTED;
return;
}
if (Format == DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM) {
/*
* We only need to support creation.
* http://msdn.microsoft.com/en-us/library/windows/hardware/ff552818.aspx
*/
return;
}
if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, 0,
PIPE_BIND_RENDER_TARGET)) {
*pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_RENDERTARGET;
*pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_BLENDABLE;
#if SUPPORT_MSAA
if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 4, 4,
PIPE_BIND_RENDER_TARGET)) {
*pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET;
}
#endif
}
if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, 0,
PIPE_BIND_SAMPLER_VIEW)) {
*pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_SHADER_SAMPLE;
#if SUPPORT_MSAA
if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 4, 4,
PIPE_BIND_RENDER_TARGET)) {
*pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_MULTISAMPLE_LOAD;
}
#endif
}
}
/*
* ----------------------------------------------------------------------
*
* CheckMultisampleQualityLevels --
*
* The CheckMultisampleQualityLevels function retrieves the number
* of quality levels that the device supports for the specified
* number of samples.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
CheckMultisampleQualityLevels(D3D10DDI_HDEVICE hDevice, // IN
DXGI_FORMAT Format, // IN
UINT SampleCount, // IN
__out UINT *pNumQualityLevels) // OUT
{
//LOG_ENTRYPOINT();
/* XXX: Disable MSAA */
*pNumQualityLevels = 0;
}
/*
* ----------------------------------------------------------------------
*
* SetTextFilterSize --
*
* The SetTextFilterSize function sets the width and height
* of the monochrome convolution filter.
*
* ----------------------------------------------------------------------
*/
void APIENTRY
SetTextFilterSize(D3D10DDI_HDEVICE hDevice, // IN
UINT Width, // IN
UINT Height) // IN
{
LOG_ENTRYPOINT();
LOG_UNSUPPORTED(Width != 1 || Height != 1);
}