1/**************************************************************************
2 *
3 * Copyright 2012-2021 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 * USE OR OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
24 * of the Software.
25 *
26 **************************************************************************/
27
28/*
29 * Adpater.cpp --
30 *    Driver entry point.
31 */
32
33
34#include "DriverIncludes.h"
35#include "Device.h"
36#include "State.h"
37
38#include "Debug.h"
39
40#include "util/u_memory.h"
41
42
43EXTERN_C struct pipe_screen *
44d3d10_create_screen(void);
45
46
47static HRESULT APIENTRY CloseAdapter(D3D10DDI_HADAPTER hAdapter);
48
49static unsigned long numAdapters = 0;
50#if 0
51static unsigned long memdbg_no = 0;
52#endif
53
54/*
55 * ----------------------------------------------------------------------
56 *
57 * OpenAdapterCommon --
58 *
59 *    Common code for OpenAdapter10 and OpenAdapter10_2
60 *
61 * ----------------------------------------------------------------------
62 */
63
64
65static HRESULT
66OpenAdapterCommon(__inout D3D10DDIARG_OPENADAPTER *pOpenData)   // IN
67{
68#if 0
69   if (numAdapters == 0) {
70      memdbg_no = debug_memory_begin();
71   }
72#endif
73   ++numAdapters;
74
75   Adapter *pAdaptor = (Adapter *)calloc(sizeof *pAdaptor, 1);
76   if (!pAdaptor) {
77      --numAdapters;
78      return E_OUTOFMEMORY;
79   }
80
81   pAdaptor->screen = d3d10_create_screen();
82   if (!pAdaptor->screen) {
83      free(pAdaptor);
84      --numAdapters;
85      return E_OUTOFMEMORY;
86   }
87
88   pOpenData->hAdapter.pDrvPrivate = pAdaptor;
89
90   pOpenData->pAdapterFuncs->pfnCalcPrivateDeviceSize = CalcPrivateDeviceSize;
91   pOpenData->pAdapterFuncs->pfnCreateDevice = CreateDevice;
92   pOpenData->pAdapterFuncs->pfnCloseAdapter = CloseAdapter;
93
94   return S_OK;
95}
96
97
98/*
99 * ----------------------------------------------------------------------
100 *
101 * OpenAdapter10 --
102 *
103 *    The OpenAdapter10 function creates a graphics adapter object
104 *    that is referenced in subsequent calls.
105 *
106 * ----------------------------------------------------------------------
107 */
108
109
110EXTERN_C HRESULT APIENTRY
111OpenAdapter10(__inout D3D10DDIARG_OPENADAPTER *pOpenData)   // IN
112{
113   LOG_ENTRYPOINT();
114
115   /*
116    * This is checked here and not on the common code because MSDN docs
117    * state that it should be ignored on OpenAdapter10_2.
118    */
119   switch (pOpenData->Interface) {
120   case D3D10_0_DDI_INTERFACE_VERSION:
121   case D3D10_0_x_DDI_INTERFACE_VERSION:
122   case D3D10_0_7_DDI_INTERFACE_VERSION:
123#if SUPPORT_D3D10_1
124   case D3D10_1_DDI_INTERFACE_VERSION:
125   case D3D10_1_x_DDI_INTERFACE_VERSION:
126   case D3D10_1_7_DDI_INTERFACE_VERSION:
127#endif
128#if SUPPORT_D3D11
129   case D3D11_0_DDI_INTERFACE_VERSION:
130   case D3D11_0_7_DDI_INTERFACE_VERSION:
131#endif
132      break;
133   default:
134      if (0) {
135         DebugPrintf("%s: unsupported interface version 0x%08x\n",
136                     __FUNCTION__, pOpenData->Interface);
137      }
138      return E_FAIL;
139   }
140
141   return OpenAdapterCommon(pOpenData);
142}
143
144
145static const UINT64
146SupportedDDIInterfaceVersions[] = {
147   D3D10_0_DDI_SUPPORTED,
148   D3D10_0_x_DDI_SUPPORTED,
149   D3D10_0_7_DDI_SUPPORTED,
150#if SUPPORT_D3D10_1
151   D3D10_1_DDI_SUPPORTED,
152   D3D10_1_x_DDI_SUPPORTED,
153   D3D10_1_7_DDI_SUPPORTED,
154#endif
155#if SUPPORT_D3D11
156   D3D11_0_DDI_SUPPORTED,
157   D3D11_0_7_DDI_SUPPORTED,
158#endif
159};
160
161
162/*
163 * ----------------------------------------------------------------------
164 *
165 * GetSupportedVersions --
166 *
167 *    Return a list of interface versions supported by the graphics
168 *    adapter.
169 *
170 * ----------------------------------------------------------------------
171 */
172
173static HRESULT APIENTRY
174GetSupportedVersions(D3D10DDI_HADAPTER hAdapter,
175                     UINT32 *puEntries,
176                     UINT64 *pSupportedDDIInterfaceVersions)
177{
178   LOG_ENTRYPOINT();
179
180   if (pSupportedDDIInterfaceVersions &&
181       *puEntries < ARRAYSIZE(SupportedDDIInterfaceVersions)) {
182      return E_OUTOFMEMORY;
183   }
184
185   *puEntries = ARRAYSIZE(SupportedDDIInterfaceVersions);
186
187   if (pSupportedDDIInterfaceVersions) {
188      memcpy(pSupportedDDIInterfaceVersions,
189             SupportedDDIInterfaceVersions,
190             sizeof SupportedDDIInterfaceVersions);
191   }
192
193   return S_OK;
194}
195
196
197/*
198 * ----------------------------------------------------------------------
199 *
200 * GetCaps --
201 *
202 *    Return the capabilities of the graphics adapter.
203 *
204 * ----------------------------------------------------------------------
205 */
206
207static HRESULT APIENTRY
208GetCaps(D3D10DDI_HADAPTER hAdapter,
209        const D3D10_2DDIARG_GETCAPS *pData)
210{
211   LOG_ENTRYPOINT();
212   memset(pData->pData, 0, pData->DataSize);
213   return S_OK;
214}
215
216
217/*
218 * ----------------------------------------------------------------------
219 *
220 * OpenAdapter10 --
221 *
222 *    The OpenAdapter10 function creates a graphics adapter object
223 *    that is referenced in subsequent calls.
224 *
225 * ----------------------------------------------------------------------
226 */
227
228
229EXTERN_C HRESULT APIENTRY
230OpenAdapter10_2(__inout D3D10DDIARG_OPENADAPTER *pOpenData)   // IN
231{
232   LOG_ENTRYPOINT();
233
234   HRESULT hr = OpenAdapterCommon(pOpenData);
235
236   if (SUCCEEDED(hr)) {
237      pOpenData->pAdapterFuncs_2->pfnGetSupportedVersions = GetSupportedVersions;
238      pOpenData->pAdapterFuncs_2->pfnGetCaps = GetCaps;
239   }
240
241   return hr;
242}
243
244
245/*
246 * ----------------------------------------------------------------------
247 *
248 * CloseAdapter --
249 *
250 *    The CloseAdapter function releases resources for a
251 *    graphics adapter object.
252 *
253 * ----------------------------------------------------------------------
254 */
255
256HRESULT APIENTRY
257CloseAdapter(D3D10DDI_HADAPTER hAdapter)  // IN
258{
259   LOG_ENTRYPOINT();
260
261   Adapter *pAdapter = CastAdapter(hAdapter);
262   struct pipe_screen *screen = pAdapter->screen;
263   screen->destroy(screen);
264   free(pAdapter);
265
266   --numAdapters;
267#if 0
268   if (numAdapters == 0) {
269      debug_memory_end(memdbg_no);
270   }
271#endif
272
273   return S_OK;
274}
275