9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBoxVideo Display D3D User mode dll
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef ___VBoxDispD3D_h___
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ___VBoxDispD3D_h___
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDispD3DIf.h"
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include "../../common/wddm/VBoxMPIf.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_CRHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxUhgsmiDisp.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#ifdef VBOX_WDDMDISP_WITH_PROFILE
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#include <iprt/asm.h>
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsyncextern volatile uint32_t g_u32VBoxDispProfileFunctionLoggerIndex;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync# define VBOXDISPPROFILE_FUNCTION_LOGGER_INDEX_GEN() ASMAtomicIncU32(&g_u32VBoxDispProfileFunctionLoggerIndex);
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync# include "VBoxDispProfile.h"
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#endif
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/cdefs.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/list.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXWDDMDISP_MAX_VERTEX_STREAMS 16
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE 16
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync#define VBOXWDDMDISP_MAX_TEX_SAMPLERS 16
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync#define VBOXWDDMDISP_TOTAL_SAMPLERS VBOXWDDMDISP_MAX_TEX_SAMPLERS + 5
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync#define VBOXWDDMDISP_SAMPLER_IDX_IS_SPECIAL(_i) ((_i) >= D3DDMAPSAMPLER && (_i) <= D3DVERTEXTEXTURESAMPLER3)
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync#define VBOXWDDMDISP_SAMPLER_IDX_SPECIAL(_i) (VBOXWDDMDISP_SAMPLER_IDX_IS_SPECIAL(_i) ? (int)((_i) - D3DDMAPSAMPLER + VBOXWDDMDISP_MAX_TEX_SAMPLERS) : (int)-1)
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync#define VBOXWDDMDISP_SAMPLER_IDX(_i) (((_i) < VBOXWDDMDISP_MAX_TEX_SAMPLERS) ? (int)(_i) : VBOXWDDMDISP_SAMPLER_IDX_SPECIAL(_i))
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync
2d4065ef19226c8187c1e987aca2ef523135a749vboxsync
40bd0fc692d21a6d579862d7ccdc20c2ccf361a5vboxsync/* maximum number of direct render targets to be used before
40bd0fc692d21a6d579862d7ccdc20c2ccf361a5vboxsync * switching to offscreen rendering */
cafde3c9008a124039e59720afbbc49002521ebfvboxsync#ifdef VBOXWDDMDISP_DEBUG
cafde3c9008a124039e59720afbbc49002521ebfvboxsync# define VBOXWDDMDISP_MAX_DIRECT_RTS g_VBoxVDbgCfgMaxDirectRts
ac7e45442a6e3b7c01faa0cdc1c48daee049ff59vboxsync#else
cafde3c9008a124039e59720afbbc49002521ebfvboxsync# define VBOXWDDMDISP_MAX_DIRECT_RTS 3
ac7e45442a6e3b7c01faa0cdc1c48daee049ff59vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
2ecff1c2f70f10cf06821afc18116b764c53fb5evboxsync#define VBOXWDDMDISP_IS_TEXTURE(_f) ((_f).Texture || (_f).Value == 0)
2ecff1c2f70f10cf06821afc18116b764c53fb5evboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXDISPVHWA_INFO
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_INFO Settings;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}VBOXDISPVHWA_INFO;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* represents settings secific to
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * display device (head) on the multiple-head graphics card
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * currently used for 2D (overlay) only since in theory its settings
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * can differ per each frontend's framebuffer. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_HEAD
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISPVHWA_INFO Vhwa;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_HEAD;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_ADAPTER
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HANDLE hAdapter;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT uIfVersion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT uRtVersion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_ADAPTERCALLBACKS RtCallbacks;
476e82bf26ef67545d5c97b8226d0679be2974fevboxsync VBOXWDDMDISP_D3D D3D;
476e82bf26ef67545d5c97b8226d0679be2974fevboxsync VBOXWDDMDISP_FORMATS Formats;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync uint32_t u32VBox3DCaps;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#ifdef VBOX_WDDMDISP_WITH_PROFILE
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileFpsCounter ProfileDdiFps;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileSet ProfileDdiFunc;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cHeads;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_HEAD aHeads[1];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_ADAPTER, *PVBOXWDDMDISP_ADAPTER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_CONTEXT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTLISTNODE ListNode;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct VBOXWDDMDISP_DEVICE *pDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDICB_CREATECONTEXT ContextInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_CONTEXT, *PVBOXWDDMDISP_CONTEXT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_STREAMSOURCEUM
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST VOID* pvBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cbStride;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_STREAMSOURCEUM, *PVBOXWDDMDISP_STREAMSOURCEUM;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_INDICIESUM
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CONST VOID* pvBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cbSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_INDICIESUM, *PVBOXWDDMDISP_INDICIESUM;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstruct VBOXWDDMDISP_ALLOCATION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_STREAM_SOURCE_INFO
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT uiOffset;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT uiStride;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_STREAM_SOURCE_INFO;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_INDICES_INFO
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
13842f48d0de2e673cc64b45bc7a48074b7fb67cvboxsync struct VBOXWDDMDISP_ALLOCATION *pIndicesAlloc;
13842f48d0de2e673cc64b45bc7a48074b7fb67cvboxsync const void *pvIndicesUm;
13842f48d0de2e673cc64b45bc7a48074b7fb67cvboxsync UINT uiStride;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_INDICES_INFO;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_RENDERTGT_FLAGS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync union
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT bAdded : 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT bRemoved : 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT Reserved : 30;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync };
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t Value;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync };
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}VBOXWDDMDISP_RENDERTGT_FLAGS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_RENDERTGT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct VBOXWDDMDISP_ALLOCATION *pAlloc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cNumFlips;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_RENDERTGT_FLAGS fFlags;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_RENDERTGT, *PVBOXWDDMDISP_RENDERTGT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXWDDMDISP_INDEX_UNDEFINED (~0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_SWAPCHAIN_FLAGS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync union
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
40bd0fc692d21a6d579862d7ccdc20c2ccf361a5vboxsync UINT bChanged : 1;
40bd0fc692d21a6d579862d7ccdc20c2ccf361a5vboxsync UINT bRtReportingPresent : 1; /* use VBox extension method for performing present */
40bd0fc692d21a6d579862d7ccdc20c2ccf361a5vboxsync UINT bSwitchReportingPresent : 1; /* switch to use VBox extension method for performing present on next present */
cafde3c9008a124039e59720afbbc49002521ebfvboxsync UINT Reserved : 29;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync };
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t Value;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync };
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}VBOXWDDMDISP_SWAPCHAIN_FLAGS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_SWAPCHAIN
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTLISTNODE ListEntry;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT iBB; /* Backbuffer index */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cRTs; /* Number of render targets in the swapchain */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_SWAPCHAIN_FLAGS fFlags;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef VBOXWDDM_WITH_VISIBLE_FB
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync IDirect3DSurface9 *pRenderTargetFbCopy;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRTFbCopyUpToDate;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync IDirect3DSwapChain9 *pSwapChainIf;
3a974120cf0d8d23b2531cd62fe04532e6ac205evboxsync /* a read-only hWnd we receive from wine
3a974120cf0d8d23b2531cd62fe04532e6ac205evboxsync * we use it for visible region notifications only,
3a974120cf0d8d23b2531cd62fe04532e6ac205evboxsync * it MUST NOT be destroyed on swapchain destruction,
3a974120cf0d8d23b2531cd62fe04532e6ac205evboxsync * wine will handle that for us */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HWND hWnd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_KMHANDLE hSwapchainKm;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_RENDERTGT aRTs[VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_SWAPCHAIN, *PVBOXWDDMDISP_SWAPCHAIN;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_DEVICE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HANDLE hDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDMDISP_ADAPTER pAdapter;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync IDirect3DDevice9 *pDevice9If;
e961f5bfe1727c6816d3dad3805ebe21b6ba1c64vboxsync RTLISTANCHOR SwapchainList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT u32IfVersion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT uRtVersion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_DEVICECALLBACKS RtCallbacks;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VOID *pvCmdBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cbCmdBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_CREATEDEVICEFLAGS fFlags;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* number of StreamSources set */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cStreamSources;
13842f48d0de2e673cc64b45bc7a48074b7fb67cvboxsync UINT cStreamSourcesUm;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_STREAMSOURCEUM aStreamSourceUm[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct VBOXWDDMDISP_ALLOCATION *aStreamSource[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_STREAM_SOURCE_INFO StreamSourceInfo[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_INDICES_INFO IndiciesInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* need to cache the ViewPort data because IDirect3DDevice9::SetViewport
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * is split into two calls : SetViewport & SetZRange */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DVIEWPORT9 ViewPort;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_CONTEXT DefaultContext;
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#ifdef VBOX_WITH_CRHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXUHGSMI_PRIVATE_D3D Uhgsmi;
ad290511521ce8388a9926b165241ecf83c330a7vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
2ecff1c2f70f10cf06821afc18116b764c53fb5evboxsync /* no lock is needed for this since we're guaranteed the per-device calls are not reentrant */
e961f5bfe1727c6816d3dad3805ebe21b6ba1c64vboxsync RTLISTANCHOR DirtyAllocList;
cf5a77c331ff5d2e6851345fef307d6ceee73097vboxsync
7c0d72e9b85a62859b5fff2c7c8a072ba63141e1vboxsync UINT cSamplerTextures;
7c0d72e9b85a62859b5fff2c7c8a072ba63141e1vboxsync struct VBOXWDDMDISP_RESOURCE *aSamplerTextures[VBOXWDDMDISP_TOTAL_SAMPLERS];
7c0d72e9b85a62859b5fff2c7c8a072ba63141e1vboxsync
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync struct VBOXWDDMDISP_RESOURCE *pDepthStencilRc;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync
91457726912962e04a49fec67f20c0c16dfafff4vboxsync HMODULE hHgsmiTransportModule;
91457726912962e04a49fec67f20c0c16dfafff4vboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#ifdef VBOX_WDDMDISP_WITH_PROFILE
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileFpsCounter ProfileDdiFps;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileSet ProfileDdiFunc;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync VBoxDispProfileSet ProfileDdiPresentCb;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#endif
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#ifdef VBOXWDDMDISP_DEBUG_TIMER
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync HANDLE hTimerQueue;
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync#endif
b9e12f78cf07f58665c0e0b2b0abba1ce7f02a5dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cRTs;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct VBOXWDDMDISP_ALLOCATION * apRTs[1];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_DEVICE, *PVBOXWDDMDISP_DEVICE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_LOCKINFO
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cLocks;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync union {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDIRANGE Range;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECT Area;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDIBOX Box;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync };
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_LOCKFLAGS fFlags;
20bc7269cdb015fe47a9a4a0511470f3b26660f8vboxsync union {
20bc7269cdb015fe47a9a4a0511470f3b26660f8vboxsync D3DLOCKED_RECT LockedRect;
20bc7269cdb015fe47a9a4a0511470f3b26660f8vboxsync D3DLOCKED_BOX LockedBox;
20bc7269cdb015fe47a9a4a0511470f3b26660f8vboxsync };
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync#ifdef VBOXWDDMDISP_DEBUG
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync PVOID pvData;
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_LOCKINFO;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef enum
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE_UNDEFINED = 0,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE_SURFACE,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE_TEXTURE,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE_CUBE_TEXTURE,
20bc7269cdb015fe47a9a4a0511470f3b26660f8vboxsync VBOXDISP_D3DIFTYPE_VOLUME_TEXTURE,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE_VERTEXBUFFER,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE_INDEXBUFFER
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXDISP_D3DIFTYPE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_ALLOCATION
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_HANDLE hAllocation;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDM_ALLOC_TYPE enmType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT iAlloc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync struct VBOXWDDMDISP_RESOURCE *pRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void* pvMem;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* object type is defined by enmD3DIfType enum */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync IUnknown *pD3DIf;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISP_D3DIFTYPE enmD3DIfType;
2ecff1c2f70f10cf06821afc18116b764c53fb5evboxsync /* list entry used to add allocation to the dirty alloc list */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTLISTNODE DirtyAllocListEntry;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync BOOLEAN fEverWritten;
2ecff1c2f70f10cf06821afc18116b764c53fb5evboxsync BOOLEAN fDirtyWrite;
46737b2c6b2da473108a7670c3682d88474bd8b9vboxsync BOOLEAN fAllocLocked;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HANDLE hSharedHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_LOCKINFO LockInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDM_DIRTYREGION DirtyRegion; /* <- dirty region to notify host about */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDM_SURFACE_DESC SurfDesc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDMDISP_SWAPCHAIN pSwapchain;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_ALLOCATION, *PVBOXWDDMDISP_ALLOCATION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_RESOURCE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HANDLE hResource;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_HANDLE hKMResource;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDMDISP_DEVICE pDevice;
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync VBOXWDDMDISP_RESOURCE_FLAGS fFlags;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDM_RC_DESC RcDesc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT cAllocations;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDMDISP_ALLOCATION aAllocations[1];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_RESOURCE, *PVBOXWDDMDISP_RESOURCE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_QUERY
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDIQUERYTYPE enmType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_ISSUEQUERYFLAGS fQueryState;
fc50d11e45d83ecb4fbb2a6761d1adb5d6cc268fvboxsync IDirect3DQuery9 *pQueryIf;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_QUERY, *PVBOXWDDMDISP_QUERY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_TSS_LOOKUP
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bSamplerState;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD dType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_TSS_LOOKUP;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef struct VBOXWDDMDISP_OVERLAY
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_HANDLE hOverlay;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDMDISP_RESOURCE *pResource;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} VBOXWDDMDISP_OVERLAY, *PVBOXWDDMDISP_OVERLAY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc) (((pRc)->cAllocations)/6)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, idx) ((D3DCUBEMAP_FACES)(D3DCUBEMAP_FACE_POSITIVE_X+(idx)%VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc)))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, idx) ((idx)%VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(PVBOXWDDMDISP_SWAPCHAIN) vboxWddmSwapchainForAlloc(PVBOXWDDMDISP_ALLOCATION pAlloc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pAlloc->pSwapchain;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(UINT) vboxWddmSwapchainIdxFb(PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (pSwapchain->iBB + pSwapchain->cRTs - 1) % pSwapchain->cRTs;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* if swapchain contains only one surface returns this surface */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(PVBOXWDDMDISP_RENDERTGT) vboxWddmSwapchainGetBb(PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSwapchain->cRTs)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pSwapchain->iBB < pSwapchain->cRTs);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return &pSwapchain->aRTs[pSwapchain->iBB];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(PVBOXWDDMDISP_RENDERTGT) vboxWddmSwapchainGetFb(PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSwapchain->cRTs)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT iFb = vboxWddmSwapchainIdxFb(pSwapchain);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return &pSwapchain->aRTs[iFb];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
dc4c9f05c58012e8b1f0bfdd12b2e14fc2f228devboxsyncvoid vboxWddmResourceInit(PVBOXWDDMDISP_RESOURCE pRc, UINT cAllocs);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
dc4c9f05c58012e8b1f0bfdd12b2e14fc2f228devboxsync#ifndef IN_VBOXCRHGSMI
dc4c9f05c58012e8b1f0bfdd12b2e14fc2f228devboxsyncPVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent);
dc4c9f05c58012e8b1f0bfdd12b2e14fc2f228devboxsyncHRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain);
dc4c9f05c58012e8b1f0bfdd12b2e14fc2f228devboxsyncVOID vboxWddmSwapchainDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain);
ac7e45442a6e3b7c01faa0cdc1c48daee049ff59vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /* #ifndef ___VBoxDispD3D_h___ */