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 * State.h -- 30 * State declarations. 31 */ 32 33 34 #include "DriverIncludes.h" 35 #include "util/u_hash_table.h" 36 37 38 #define SUPPORT_MSAA 0 39 #define SUPPORT_D3D10_1 0 40 #define SUPPORT_D3D11 0 41 42 43 struct Adapter 44 { 45 struct pipe_screen *screen; 46 }; 47 48 49 static inline Adapter * 50 CastAdapter(D3D10DDI_HADAPTER hAdapter) 51 { 52 return static_cast<Adapter *>(hAdapter.pDrvPrivate); 53 } 54 55 struct Shader 56 { 57 void *handle; 58 uint type; 59 struct pipe_shader_state state; 60 unsigned output_mapping[PIPE_MAX_SHADER_OUTPUTS]; 61 boolean output_resolved; 62 }; 63 64 struct Query; 65 66 struct Device 67 { 68 struct pipe_context *pipe; 69 70 struct pipe_framebuffer_state fb; 71 struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS]; 72 struct pipe_resource *index_buffer; 73 unsigned restart_index; 74 unsigned index_size; 75 unsigned ib_offset; 76 void *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; 77 struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS]; 78 79 void *empty_fs; 80 void *empty_vs; 81 82 enum pipe_prim_type primitive; 83 84 struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_BUFFERS]; 85 struct pipe_stream_output_target *draw_so_target; 86 Shader *bound_empty_gs; 87 Shader *bound_vs; 88 89 unsigned max_dual_source_render_targets; 90 91 D3D10DDI_HRTCORELAYER hRTCoreLayer; 92 93 HANDLE hDevice; 94 HANDLE hContext; 95 96 D3DDDI_DEVICECALLBACKS KTCallbacks; 97 D3D10DDI_CORELAYER_DEVICECALLBACKS UMCallbacks; 98 DXGI_DDI_BASE_CALLBACKS *pDXGIBaseCallbacks; 99 100 INT LastEmittedQuerySeqNo; 101 INT LastFinishedQuerySeqNo; 102 103 Query *pPredicate; 104 BOOL PredicateValue; 105 }; 106 107 108 static inline Device * 109 CastDevice(D3D10DDI_HDEVICE hDevice) 110 { 111 return static_cast<Device *>(hDevice.pDrvPrivate); 112 } 113 114 115 static inline struct pipe_context * 116 CastPipeContext(D3D10DDI_HDEVICE hDevice) 117 { 118 Device *pDevice = CastDevice(hDevice); 119 return pDevice ? pDevice->pipe : NULL; 120 } 121 122 123 static inline Device * 124 CastDevice(DXGI_DDI_HDEVICE hDevice) 125 { 126 return reinterpret_cast<Device *>(hDevice); 127 } 128 129 130 static inline struct pipe_context * 131 CastPipeDevice(DXGI_DDI_HDEVICE hDevice) 132 { 133 Device *pDevice = CastDevice(hDevice); 134 return pDevice ? pDevice->pipe : NULL; 135 } 136 137 138 static inline void 139 SetError(D3D10DDI_HDEVICE hDevice, HRESULT hr) 140 { 141 if (FAILED(hr)) { 142 Device *pDevice = CastDevice(hDevice); 143 pDevice->UMCallbacks.pfnSetErrorCb(pDevice->hRTCoreLayer, hr); 144 } 145 } 146 147 148 struct Resource 149 { 150 DXGI_FORMAT Format; 151 UINT MipLevels; 152 UINT NumSubResources; 153 struct pipe_resource *resource; 154 struct pipe_transfer **transfers; 155 struct pipe_stream_output_target *so_target; 156 }; 157 158 159 static inline Resource * 160 CastResource(D3D10DDI_HRESOURCE hResource) 161 { 162 return static_cast<Resource *>(hResource.pDrvPrivate); 163 } 164 165 166 static inline Resource * 167 CastResource(DXGI_DDI_HRESOURCE hResource) 168 { 169 return reinterpret_cast<Resource *>(hResource); 170 } 171 172 173 static inline struct pipe_resource * 174 CastPipeResource(D3D10DDI_HRESOURCE hResource) 175 { 176 Resource *pResource = CastResource(hResource); 177 return pResource ? pResource->resource : NULL; 178 } 179 180 181 static inline struct pipe_resource * 182 CastPipeResource(DXGI_DDI_HRESOURCE hResource) 183 { 184 Resource *pResource = CastResource(hResource); 185 return pResource ? pResource->resource : NULL; 186 } 187 188 189 static inline struct pipe_resource * 190 CastPipeBuffer(D3D10DDI_HRESOURCE hResource) 191 { 192 Resource *pResource = CastResource(hResource); 193 if (!pResource) { 194 return NULL; 195 } 196 return static_cast<struct pipe_resource *>(pResource->resource); 197 } 198 199 200 struct RenderTargetView 201 { 202 struct pipe_surface *surface; 203 D3D10DDI_HRTRENDERTARGETVIEW hRTRenderTargetView; 204 }; 205 206 207 static inline RenderTargetView * 208 CastRenderTargetView(D3D10DDI_HRENDERTARGETVIEW hRenderTargetView) 209 { 210 return static_cast<RenderTargetView *>(hRenderTargetView.pDrvPrivate); 211 } 212 213 214 static inline struct pipe_surface * 215 CastPipeRenderTargetView(D3D10DDI_HRENDERTARGETVIEW hRenderTargetView) 216 { 217 RenderTargetView *pRenderTargetView = CastRenderTargetView(hRenderTargetView); 218 return pRenderTargetView ? pRenderTargetView->surface : NULL; 219 } 220 221 222 struct DepthStencilView 223 { 224 struct pipe_surface *surface; 225 D3D10DDI_HRTDEPTHSTENCILVIEW hRTDepthStencilView; 226 }; 227 228 229 static inline DepthStencilView * 230 CastDepthStencilView(D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView) 231 { 232 return static_cast<DepthStencilView *>(hDepthStencilView.pDrvPrivate); 233 } 234 235 236 static inline struct pipe_surface * 237 CastPipeDepthStencilView(D3D10DDI_HDEPTHSTENCILVIEW hDepthStencilView) 238 { 239 DepthStencilView *pDepthStencilView = CastDepthStencilView(hDepthStencilView); 240 return pDepthStencilView ? pDepthStencilView->surface : NULL; 241 } 242 243 244 struct BlendState 245 { 246 void *handle; 247 }; 248 249 250 static inline BlendState * 251 CastBlendState(D3D10DDI_HBLENDSTATE hBlendState) 252 { 253 return static_cast<BlendState *>(hBlendState.pDrvPrivate); 254 } 255 256 257 static inline void * 258 CastPipeBlendState(D3D10DDI_HBLENDSTATE hBlendState) 259 { 260 BlendState *pBlendState = CastBlendState(hBlendState); 261 return pBlendState ? pBlendState->handle : NULL; 262 } 263 264 265 struct DepthStencilState 266 { 267 void *handle; 268 }; 269 270 271 static inline DepthStencilState * 272 CastDepthStencilState(D3D10DDI_HDEPTHSTENCILSTATE hDepthStencilState) 273 { 274 return static_cast<DepthStencilState *>(hDepthStencilState.pDrvPrivate); 275 } 276 277 278 static inline void * 279 CastPipeDepthStencilState(D3D10DDI_HDEPTHSTENCILSTATE hDepthStencilState) 280 { 281 DepthStencilState *pDepthStencilState = CastDepthStencilState(hDepthStencilState); 282 return pDepthStencilState ? pDepthStencilState->handle : NULL; 283 } 284 285 286 struct RasterizerState 287 { 288 void *handle; 289 }; 290 291 292 static inline RasterizerState * 293 CastRasterizerState(D3D10DDI_HRASTERIZERSTATE hRasterizerState) 294 { 295 return static_cast<RasterizerState *>(hRasterizerState.pDrvPrivate); 296 } 297 298 299 static inline void * 300 CastPipeRasterizerState(D3D10DDI_HRASTERIZERSTATE hRasterizerState) 301 { 302 RasterizerState *pRasterizerState = CastRasterizerState(hRasterizerState); 303 return pRasterizerState ? pRasterizerState->handle : NULL; 304 } 305 306 307 static inline Shader * 308 CastShader(D3D10DDI_HSHADER hShader) 309 { 310 return static_cast<Shader *>(hShader.pDrvPrivate); 311 } 312 313 314 static inline void * 315 CastPipeShader(D3D10DDI_HSHADER hShader) 316 { 317 Shader *pShader = static_cast<Shader *>(hShader.pDrvPrivate); 318 return pShader ? pShader->handle : NULL; 319 } 320 321 322 struct ElementLayout 323 { 324 void *handle; 325 }; 326 327 328 static inline ElementLayout * 329 CastElementLayout(D3D10DDI_HELEMENTLAYOUT hElementLayout) 330 { 331 return static_cast<ElementLayout *>(hElementLayout.pDrvPrivate); 332 } 333 334 static inline void * 335 CastPipeInputLayout(D3D10DDI_HELEMENTLAYOUT hElementLayout) 336 { 337 ElementLayout *pElementLayout = CastElementLayout(hElementLayout); 338 return pElementLayout ? pElementLayout->handle : NULL; 339 } 340 341 342 struct SamplerState 343 { 344 void *handle; 345 }; 346 347 348 static inline SamplerState * 349 CastSamplerState(D3D10DDI_HSAMPLER hSampler) 350 { 351 return static_cast<SamplerState *>(hSampler.pDrvPrivate); 352 } 353 354 355 static inline void * 356 CastPipeSamplerState(D3D10DDI_HSAMPLER hSampler) 357 { 358 SamplerState *pSamplerState = CastSamplerState(hSampler); 359 return pSamplerState ? pSamplerState->handle : NULL; 360 } 361 362 363 struct ShaderResourceView 364 { 365 struct pipe_sampler_view *handle; 366 }; 367 368 369 static inline ShaderResourceView * 370 CastShaderResourceView(D3D10DDI_HSHADERRESOURCEVIEW hShaderResourceView) 371 { 372 return static_cast<ShaderResourceView *>(hShaderResourceView.pDrvPrivate); 373 } 374 375 376 static inline struct pipe_sampler_view * 377 CastPipeShaderResourceView(D3D10DDI_HSHADERRESOURCEVIEW hShaderResourceView) 378 { 379 ShaderResourceView *pSRView = CastShaderResourceView(hShaderResourceView); 380 return pSRView ? pSRView->handle : NULL; 381 } 382 383 384 struct Query 385 { 386 D3D10DDI_QUERY Type; 387 UINT Flags; 388 389 unsigned pipe_type; 390 struct pipe_query *handle; 391 INT SeqNo; 392 UINT GetDataCount; 393 394 D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS Statistics; 395 }; 396 397 398 static inline Query * 399 CastQuery(D3D10DDI_HQUERY hQuery) 400 { 401 return static_cast<Query *>(hQuery.pDrvPrivate); 402 } 403 404 405 static inline struct pipe_query * 406 CastPipeQuery(D3D10DDI_HQUERY hQuery) 407 { 408 Query *pQuery = CastQuery(hQuery); 409 return pQuery ? pQuery->handle : NULL; 410 } 411 412