1 /****************************************************************************
2 * Copyright (C) 2014-2016 Intel Corporation. All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * @brief API definitions
27 ******************************************************************************/
32 #include "common/os.h"
37 #include "common/intrin.h"
38 #include "common/formats.h"
39 #include "core/state.h"
41 typedef void(SWR_API
*PFN_CALLBACK_FUNC
)(uint64_t data
, uint64_t data2
, uint64_t data3
);
43 //////////////////////////////////////////////////////////////////////////
44 /// @brief Rectangle structure
47 int32_t xmin
; ///< inclusive
48 int32_t ymin
; ///< inclusive
49 int32_t xmax
; ///< exclusive
50 int32_t ymax
; ///< exclusive
52 bool operator == (const SWR_RECT
& rhs
)
54 return (this->ymin
== rhs
.ymin
&&
55 this->ymax
== rhs
.ymax
&&
56 this->xmin
== rhs
.xmin
&&
57 this->xmax
== rhs
.xmax
);
60 bool operator != (const SWR_RECT
& rhs
)
62 return !(*this == rhs
);
65 SWR_RECT
& Intersect(const SWR_RECT
& other
)
67 this->xmin
= std::max(this->xmin
, other
.xmin
);
68 this->ymin
= std::max(this->ymin
, other
.ymin
);
69 this->xmax
= std::min(this->xmax
, other
.xmax
);
70 this->ymax
= std::min(this->ymax
, other
.ymax
);
72 if (xmax
- xmin
< 0 ||
76 ymin
= ymax
= xmin
= xmax
= 0;
81 SWR_RECT
& operator &= (const SWR_RECT
& other
)
83 return Intersect(other
);
86 SWR_RECT
& Union(const SWR_RECT
& other
)
88 this->xmin
= std::min(this->xmin
, other
.xmin
);
89 this->ymin
= std::min(this->ymin
, other
.ymin
);
90 this->xmax
= std::max(this->xmax
, other
.xmax
);
91 this->ymax
= std::max(this->ymax
, other
.ymax
);
96 SWR_RECT
& operator |= (const SWR_RECT
& other
)
101 void Translate(int32_t x
, int32_t y
)
110 //////////////////////////////////////////////////////////////////////////
111 /// @brief Function signature for load hot tiles
112 /// @param hPrivateContext - handle to private data
113 /// @param dstFormat - format of the hot tile
114 /// @param renderTargetIndex - render target to store, can be color, depth or stencil
115 /// @param x - destination x coordinate
116 /// @param y - destination y coordinate
117 /// @param pDstHotTile - pointer to the hot tile surface
118 typedef void(SWR_API
*PFN_LOAD_TILE
)(HANDLE hPrivateContext
, SWR_FORMAT dstFormat
,
119 SWR_RENDERTARGET_ATTACHMENT renderTargetIndex
,
120 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
, uint8_t *pDstHotTile
);
122 //////////////////////////////////////////////////////////////////////////
123 /// @brief Function signature for store hot tiles
124 /// @param hPrivateContext - handle to private data
125 /// @param srcFormat - format of the hot tile
126 /// @param renderTargetIndex - render target to store, can be color, depth or stencil
127 /// @param x - destination x coordinate
128 /// @param y - destination y coordinate
129 /// @param pSrcHotTile - pointer to the hot tile surface
130 typedef void(SWR_API
*PFN_STORE_TILE
)(HANDLE hPrivateContext
, SWR_FORMAT srcFormat
,
131 SWR_RENDERTARGET_ATTACHMENT renderTargetIndex
,
132 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
, uint8_t *pSrcHotTile
);
134 //////////////////////////////////////////////////////////////////////////
135 /// @brief Function signature for clearing from the hot tiles clear value
136 /// @param hPrivateContext - handle to private data
137 /// @param renderTargetIndex - render target to store, can be color, depth or stencil
138 /// @param x - destination x coordinate
139 /// @param y - destination y coordinate
140 /// @param renderTargetArrayIndex - render target array offset from arrayIndex
141 /// @param pClearColor - pointer to the hot tile's clear value
142 typedef void(SWR_API
*PFN_CLEAR_TILE
)(HANDLE hPrivateContext
,
143 SWR_RENDERTARGET_ATTACHMENT rtIndex
,
144 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
, const float* pClearColor
);
146 //////////////////////////////////////////////////////////////////////////
147 /// @brief Callback to allow driver to update their copy of streamout write offset.
148 /// This is call is made for any draw operation that has streamout enabled
149 /// and has updated the write offset.
150 /// @param hPrivateContext - handle to private data
151 /// @param soBufferSlot - buffer slot for write offset
152 /// @param soWriteOffset - update value for so write offset.
153 typedef void(SWR_API
*PFN_UPDATE_SO_WRITE_OFFSET
)(HANDLE hPrivateContext
,
154 uint32_t soBufferSlot
, uint32_t soWriteOffset
);
156 //////////////////////////////////////////////////////////////////////////
157 /// @brief Callback to allow driver to update their copy of stats.
158 /// @param hPrivateContext - handle to private data
159 /// @param pStats - pointer to draw stats
160 typedef void(SWR_API
*PFN_UPDATE_STATS
)(HANDLE hPrivateContext
,
161 const SWR_STATS
* pStats
);
163 //////////////////////////////////////////////////////////////////////////
164 /// @brief Callback to allow driver to update their copy of FE stats.
165 /// @note Its optimal to have a separate callback for FE stats since
166 /// there is only one DC per FE thread. This means we do not have
167 /// to sum up the stats across all of the workers.
168 /// @param hPrivateContext - handle to private data
169 /// @param pStats - pointer to draw stats
170 typedef void(SWR_API
*PFN_UPDATE_STATS_FE
)(HANDLE hPrivateContext
,
171 const SWR_STATS_FE
* pStats
);
173 //////////////////////////////////////////////////////////////////////////
175 /// Forward Declaration (see rdtsc_buckets.h for full definition)
176 /////////////////////////////////////////////////////////////////////////
179 //////////////////////////////////////////////////////////////////////////
180 /// SWR_THREADING_INFO
181 /////////////////////////////////////////////////////////////////////////
182 struct SWR_THREADING_INFO
184 uint32_t BASE_NUMA_NODE
;
186 uint32_t BASE_THREAD
;
187 uint32_t MAX_WORKER_THREADS
;
188 uint32_t MAX_NUMA_NODES
;
189 uint32_t MAX_CORES_PER_NUMA_NODE
;
190 uint32_t MAX_THREADS_PER_CORE
;
191 bool SINGLE_THREADED
;
194 //////////////////////////////////////////////////////////////////////////
195 /// SWR_API_THREADING_INFO
196 /// Data used to reserve HW threads for API use
197 /// API Threads are reserved from numa nodes / cores used for
198 /// SWR Worker threads. Specifying reserved threads here can reduce
199 /// the total number of SWR worker threads.
200 /////////////////////////////////////////////////////////////////////////
201 struct SWR_API_THREADING_INFO
203 uint32_t numAPIReservedThreads
; // Default is 1 if SWR_API_THREADING_INFO is not sent
204 uint32_t bindAPIThread0
; // Default is true if numAPIReservedThreads is > 0,
205 // binds thread used in SwrCreateContext to API Reserved
207 uint32_t numAPIThreadsPerCore
; // 0 - means use all threads per core, else clamp to this number.
208 // Independent of KNOB_MAX_THREADS_PER_CORE.
212 //////////////////////////////////////////////////////////////////////////
213 /// SWR_CREATECONTEXT_INFO
214 /////////////////////////////////////////////////////////////////////////
215 struct SWR_CREATECONTEXT_INFO
217 // External functions (e.g. sampler) need per draw context state.
218 // Use SwrGetPrivateContextState() to access private state.
219 uint32_t privateStateSize
;
221 // Callback functions
222 PFN_LOAD_TILE pfnLoadTile
;
223 PFN_STORE_TILE pfnStoreTile
;
224 PFN_CLEAR_TILE pfnClearTile
;
225 PFN_UPDATE_SO_WRITE_OFFSET pfnUpdateSoWriteOffset
;
226 PFN_UPDATE_STATS pfnUpdateStats
;
227 PFN_UPDATE_STATS_FE pfnUpdateStatsFE
;
230 // Pointer to rdtsc buckets mgr returned to the caller.
231 // Only populated when KNOB_ENABLE_RDTSC is set
232 BucketManager
* pBucketMgr
;
234 // Output: size required memory passed to for SwrSaveState / SwrRestoreState
235 size_t contextSaveSize
;
237 // ArchRast event manager.
238 HANDLE hArEventManager
;
240 // Input (optional): Threading info that overrides any set KNOB values.
241 SWR_THREADING_INFO
* pThreadInfo
;
243 // Input (optional}: Info for reserving API threads
244 SWR_API_THREADING_INFO
* pApiThreadInfo
;
246 // Input: if set to non-zero value, overrides KNOB value for maximum
247 // number of draws in flight
248 uint32_t MAX_DRAWS_IN_FLIGHT
;
251 //////////////////////////////////////////////////////////////////////////
252 /// @brief Create SWR Context.
253 /// @param pCreateInfo - pointer to creation info.
254 SWR_FUNC(HANDLE
, SwrCreateContext
,
255 SWR_CREATECONTEXT_INFO
* pCreateInfo
);
257 //////////////////////////////////////////////////////////////////////////
258 /// @brief Destroys SWR Context.
259 /// @param hContext - Handle passed back from SwrCreateContext
260 SWR_FUNC(void, SwrDestroyContext
,
263 //////////////////////////////////////////////////////////////////////////
264 /// @brief Bind current thread to an API reserved HW thread
265 /// @param hContext - Handle passed back from SwrCreateContext
266 /// @param apiThreadId - index of reserved HW thread to bind to.
267 SWR_FUNC(void, SwrBindApiThread
,
269 uint32_t apiThreadId
);
271 //////////////////////////////////////////////////////////////////////////
272 /// @brief Saves API state associated with hContext
273 /// @param hContext - Handle passed back from SwrCreateContext
274 /// @param pOutputStateBlock - Memory block to receive API state data
275 /// @param memSize - Size of memory pointed to by pOutputStateBlock
276 SWR_FUNC(void, SwrSaveState
,
278 void* pOutputStateBlock
,
281 //////////////////////////////////////////////////////////////////////////
282 /// @brief Restores API state to hContext previously saved with SwrSaveState
283 /// @param hContext - Handle passed back from SwrCreateContext
284 /// @param pStateBlock - Memory block to read API state data from
285 /// @param memSize - Size of memory pointed to by pStateBlock
286 SWR_FUNC(void, SwrRestoreState
,
288 const void* pStateBlock
,
291 //////////////////////////////////////////////////////////////////////////
292 /// @brief Sync cmd. Executes the callback func when all rendering up to this sync
293 /// has been completed
294 /// @param hContext - Handle passed back from SwrCreateContext
295 /// @param pfnFunc - pointer to callback function,
296 /// @param userData - user data to pass back
297 SWR_FUNC(void, SwrSync
,
299 PFN_CALLBACK_FUNC pfnFunc
,
304 //////////////////////////////////////////////////////////////////////////
305 /// @brief Stall cmd. Stalls the backend until all previous work has been completed.
306 /// Frontend work can continue to make progress
307 /// @param hContext - Handle passed back from SwrCreateContext
308 SWR_FUNC(void, SwrStallBE
,
311 //////////////////////////////////////////////////////////////////////////
312 /// @brief Blocks until all rendering has been completed.
313 /// @param hContext - Handle passed back from SwrCreateContext
314 SWR_FUNC(void, SwrWaitForIdle
,
317 //////////////////////////////////////////////////////////////////////////
318 /// @brief Blocks until all FE rendering has been completed.
319 /// @param hContext - Handle passed back from SwrCreateContext
320 SWR_FUNC(void, SwrWaitForIdleFE
,
323 //////////////////////////////////////////////////////////////////////////
324 /// @brief Set vertex buffer state.
325 /// @param hContext - Handle passed back from SwrCreateContext
326 /// @param numBuffers - Number of vertex buffer state descriptors.
327 /// @param pVertexBuffers - Array of vertex buffer state descriptors.
328 SWR_FUNC(void, SwrSetVertexBuffers
,
331 const SWR_VERTEX_BUFFER_STATE
* pVertexBuffers
);
333 //////////////////////////////////////////////////////////////////////////
334 /// @brief Set index buffer
335 /// @param hContext - Handle passed back from SwrCreateContext
336 /// @param pIndexBuffer - Index buffer.
337 SWR_FUNC(void, SwrSetIndexBuffer
,
339 const SWR_INDEX_BUFFER_STATE
* pIndexBuffer
);
341 //////////////////////////////////////////////////////////////////////////
342 /// @brief Set fetch shader pointer.
343 /// @param hContext - Handle passed back from SwrCreateContext
344 /// @param pfnFetchFunc - Pointer to shader.
345 SWR_FUNC(void, SwrSetFetchFunc
,
347 PFN_FETCH_FUNC pfnFetchFunc
);
349 //////////////////////////////////////////////////////////////////////////
350 /// @brief Set streamout shader pointer.
351 /// @param hContext - Handle passed back from SwrCreateContext
352 /// @param pfnSoFunc - Pointer to shader.
353 /// @param streamIndex - specifies stream
354 SWR_FUNC(void, SwrSetSoFunc
,
356 PFN_SO_FUNC pfnSoFunc
,
357 uint32_t streamIndex
);
359 //////////////////////////////////////////////////////////////////////////
360 /// @brief Set streamout state
361 /// @param hContext - Handle passed back from SwrCreateContext
362 /// @param pSoState - Pointer to streamout state.
363 SWR_FUNC(void, SwrSetSoState
,
365 SWR_STREAMOUT_STATE
* pSoState
);
367 //////////////////////////////////////////////////////////////////////////
368 /// @brief Set streamout buffer state
369 /// @param hContext - Handle passed back from SwrCreateContext
370 /// @param pSoBuffer - Pointer to streamout buffer.
371 /// @param slot - Slot to bind SO buffer to.
372 SWR_FUNC(void, SwrSetSoBuffers
,
374 SWR_STREAMOUT_BUFFER
* pSoBuffer
,
377 //////////////////////////////////////////////////////////////////////////
378 /// @brief Set vertex shader pointer.
379 /// @param hContext - Handle passed back from SwrCreateContext
380 /// @param pfnVertexFunc - Pointer to shader.
381 SWR_FUNC(void, SwrSetVertexFunc
,
383 PFN_VERTEX_FUNC pfnVertexFunc
);
385 //////////////////////////////////////////////////////////////////////////
386 /// @brief Set frontend state.
387 /// @param hContext - Handle passed back from SwrCreateContext
388 /// @param pState - Pointer to state
389 SWR_FUNC(void, SwrSetFrontendState
,
391 SWR_FRONTEND_STATE
*pState
);
393 //////////////////////////////////////////////////////////////////////////
394 /// @brief Set geometry shader state.
395 /// @param hContext - Handle passed back from SwrCreateContext
396 /// @param pState - Pointer to state
397 SWR_FUNC(void, SwrSetGsState
,
399 SWR_GS_STATE
*pState
);
401 //////////////////////////////////////////////////////////////////////////
402 /// @brief Set geometry shader
403 /// @param hContext - Handle passed back from SwrCreateContext
404 /// @param pState - Pointer to geometry shader function
405 SWR_FUNC(void, SwrSetGsFunc
,
407 PFN_GS_FUNC pfnGsFunc
);
409 //////////////////////////////////////////////////////////////////////////
410 /// @brief Set compute shader
411 /// @param hContext - Handle passed back from SwrCreateContext
412 /// @param pfnCsFunc - Pointer to compute shader function
413 /// @param totalThreadsInGroup - product of thread group dimensions.
414 /// @param totalSpillFillSize - size in bytes needed for spill/fill.
415 /// @param scratchSpaceSizePerInstance - size of the scratch space needed per simd instance
416 /// @param numInstances - number of simd instances that are run per execution of the shader
417 SWR_FUNC(void, SwrSetCsFunc
,
419 PFN_CS_FUNC pfnCsFunc
,
420 uint32_t totalThreadsInGroup
,
421 uint32_t totalSpillFillSize
,
422 uint32_t scratchSpaceSizePerInstance
,
423 uint32_t numInstances
426 //////////////////////////////////////////////////////////////////////////
427 /// @brief Set tessellation state.
428 /// @param hContext - Handle passed back from SwrCreateContext
429 /// @param pState - Pointer to state
430 SWR_FUNC(void, SwrSetTsState
,
432 SWR_TS_STATE
*pState
);
434 //////////////////////////////////////////////////////////////////////////
435 /// @brief Set hull shader
436 /// @param hContext - Handle passed back from SwrCreateContext
437 /// @param pfnFunc - Pointer to shader function
438 SWR_FUNC(void, SwrSetHsFunc
,
440 PFN_HS_FUNC pfnFunc
);
442 //////////////////////////////////////////////////////////////////////////
443 /// @brief Set domain shader
444 /// @param hContext - Handle passed back from SwrCreateContext
445 /// @param pfnFunc - Pointer to shader function
446 SWR_FUNC(void, SwrSetDsFunc
,
448 PFN_DS_FUNC pfnFunc
);
450 //////////////////////////////////////////////////////////////////////////
451 /// @brief Set depth stencil state
452 /// @param hContext - Handle passed back from SwrCreateContext
453 /// @param pState - Pointer to state.
454 SWR_FUNC(void, SwrSetDepthStencilState
,
456 SWR_DEPTH_STENCIL_STATE
*pState
);
458 //////////////////////////////////////////////////////////////////////////
459 /// @brief Set backend state
460 /// @param hContext - Handle passed back from SwrCreateContext
461 /// @param pState - Pointer to state.
462 SWR_FUNC(void, SwrSetBackendState
,
464 SWR_BACKEND_STATE
*pState
);
466 //////////////////////////////////////////////////////////////////////////
467 /// @brief Set depth bounds state
468 /// @param hContext - Handle passed back from SwrCreateContext
469 /// @param pState - Pointer to state.
470 SWR_FUNC(void, SwrSetDepthBoundsState
,
472 SWR_DEPTH_BOUNDS_STATE
*pState
);
474 //////////////////////////////////////////////////////////////////////////
475 /// @brief Set pixel shader state
476 /// @param hContext - Handle passed back from SwrCreateContext
477 /// @param pState - Pointer to state.
478 SWR_FUNC(void, SwrSetPixelShaderState
,
480 SWR_PS_STATE
*pState
);
482 //////////////////////////////////////////////////////////////////////////
483 /// @brief Set blend state
484 /// @param hContext - Handle passed back from SwrCreateContext
485 /// @param pState - Pointer to state.
486 SWR_FUNC(void, SwrSetBlendState
,
488 SWR_BLEND_STATE
*pState
);
490 //////////////////////////////////////////////////////////////////////////
491 /// @brief Set blend function
492 /// @param hContext - Handle passed back from SwrCreateContext
493 /// @param renderTarget - render target index
494 /// @param pfnBlendFunc - function pointer
495 SWR_FUNC(void, SwrSetBlendFunc
,
497 uint32_t renderTarget
,
498 PFN_BLEND_JIT_FUNC pfnBlendFunc
);
500 //////////////////////////////////////////////////////////////////////////
502 /// @param hContext - Handle passed back from SwrCreateContext
503 /// @param topology - Specifies topology for draw.
504 /// @param startVertex - Specifies start vertex in vertex buffer for draw.
505 /// @param primCount - Number of vertices.
506 SWR_FUNC(void, SwrDraw
,
508 PRIMITIVE_TOPOLOGY topology
,
509 uint32_t startVertex
,
512 //////////////////////////////////////////////////////////////////////////
513 /// @brief SwrDrawInstanced
514 /// @param hContext - Handle passed back from SwrCreateContext
515 /// @param topology - Specifies topology for draw.
516 /// @param numVertsPerInstance - How many vertices to read sequentially from vertex data.
517 /// @param numInstances - How many instances to render.
518 /// @param startVertex - Specifies start vertex for draw. (vertex data)
519 /// @param startInstance - Which instance to start sequentially fetching from in each buffer (instanced data)
520 SWR_FUNC(void, SwrDrawInstanced
,
522 PRIMITIVE_TOPOLOGY topology
,
523 uint32_t numVertsPerInstance
,
524 uint32_t numInstances
,
525 uint32_t startVertex
,
526 uint32_t startInstance
);
528 //////////////////////////////////////////////////////////////////////////
529 /// @brief DrawIndexed
530 /// @param hContext - Handle passed back from SwrCreateContext
531 /// @param topology - Specifies topology for draw.
532 /// @param numIndices - Number of indices to read sequentially from index buffer.
533 /// @param indexOffset - Starting index into index buffer.
534 /// @param baseVertex - Vertex in vertex buffer to consider as index "0". Note value is signed.
535 SWR_FUNC(void, SwrDrawIndexed
,
537 PRIMITIVE_TOPOLOGY topology
,
539 uint32_t indexOffset
,
542 //////////////////////////////////////////////////////////////////////////
543 /// @brief SwrDrawIndexedInstanced
544 /// @param hContext - Handle passed back from SwrCreateContext
545 /// @param topology - Specifies topology for draw.
546 /// @param numIndices - Number of indices to read sequentially from index buffer.
547 /// @param numInstances - Number of instances to render.
548 /// @param indexOffset - Starting index into index buffer.
549 /// @param baseVertex - Vertex in vertex buffer to consider as index "0". Note value is signed.
550 /// @param startInstance - Which instance to start sequentially fetching from in each buffer (instanced data)
551 SWR_FUNC(void, SwrDrawIndexedInstanced
,
553 PRIMITIVE_TOPOLOGY topology
,
555 uint32_t numInstances
,
556 uint32_t indexOffset
,
558 uint32_t startInstance
);
560 //////////////////////////////////////////////////////////////////////////
561 /// @brief SwrInvalidateTiles
562 /// @param hContext - Handle passed back from SwrCreateContext
563 /// @param attachmentMask - The mask specifies which surfaces attached to the hottiles to invalidate.
564 /// @param invalidateRect - The pixel-coordinate rectangle to invalidate. This will be expanded to
565 /// be hottile size-aligned.
566 SWR_FUNC(void, SwrInvalidateTiles
,
568 uint32_t attachmentMask
,
569 const SWR_RECT
& invalidateRect
);
571 //////////////////////////////////////////////////////////////////////////
572 /// @brief SwrDiscardRect
573 /// @param hContext - Handle passed back from SwrCreateContext
574 /// @param attachmentMask - The mask specifies which surfaces attached to the hottiles to discard.
575 /// @param rect - The pixel-coordinate rectangle to discard. Only fully-covered hottiles will be
577 SWR_FUNC(void, SwrDiscardRect
,
579 uint32_t attachmentMask
,
580 const SWR_RECT
& rect
);
582 //////////////////////////////////////////////////////////////////////////
583 /// @brief SwrDispatch
584 /// @param hContext - Handle passed back from SwrCreateContext
585 /// @param threadGroupCountX - Number of thread groups dispatched in X direction
586 /// @param threadGroupCountY - Number of thread groups dispatched in Y direction
587 /// @param threadGroupCountZ - Number of thread groups dispatched in Z direction
588 SWR_FUNC(void, SwrDispatch
,
590 uint32_t threadGroupCountX
,
591 uint32_t threadGroupCountY
,
592 uint32_t threadGroupCountZ
);
597 SWR_TILE_INVALID
= 0, // tile is in unitialized state and should be loaded with surface contents before rendering
598 SWR_TILE_DIRTY
= 2, // tile contains newer data than surface it represents
599 SWR_TILE_RESOLVED
= 3, // is in sync with surface it represents
602 /// @todo Add a good description for what attachments are and when and why you would use the different SWR_TILE_STATEs.
603 SWR_FUNC(void, SwrStoreTiles
,
605 uint32_t attachmentMask
,
606 SWR_TILE_STATE postStoreTileState
,
607 const SWR_RECT
& storeRect
);
610 //////////////////////////////////////////////////////////////////////////
611 /// @brief SwrClearRenderTarget - Clear attached render targets / depth / stencil
612 /// @param hContext - Handle passed back from SwrCreateContext
613 /// @param attachmentMask - combination of SWR_ATTACHMENT_*_BIT attachments to clear
614 /// @param renderTargetArrayIndex - the RT array index to clear
615 /// @param clearColor - color use for clearing render targets
616 /// @param z - depth value use for clearing depth buffer
617 /// @param stencil - stencil value used for clearing stencil buffer
618 /// @param clearRect - The pixel-coordinate rectangle to clear in all cleared buffers
619 SWR_FUNC(void, SwrClearRenderTarget
,
621 uint32_t attachmentMask
,
622 uint32_t renderTargetArrayIndex
,
623 const float clearColor
[4],
626 const SWR_RECT
& clearRect
);
628 //////////////////////////////////////////////////////////////////////////
629 /// @brief SwrSetRastState
630 /// @param hContext - Handle passed back from SwrCreateContext
631 /// @param pRastState - New SWR_RASTSTATE used for SwrDraw* commands
632 SWR_FUNC(void, SwrSetRastState
,
634 const SWR_RASTSTATE
*pRastState
);
636 //////////////////////////////////////////////////////////////////////////
637 /// @brief SwrSetViewports
638 /// @param hContext - Handle passed back from SwrCreateContext
639 /// @param numViewports - number of viewports passed in
640 /// @param pViewports - Specifies extents of viewport.
641 /// @param pMatrices - If not specified then SWR computes a default one.
642 SWR_FUNC(void, SwrSetViewports
,
644 uint32_t numViewports
,
645 const SWR_VIEWPORT
* pViewports
,
646 const SWR_VIEWPORT_MATRICES
* pMatrices
);
648 //////////////////////////////////////////////////////////////////////////
649 /// @brief SwrSetScissorRects
650 /// @param hContext - Handle passed back from SwrCreateContext
651 /// @param numScissors - number of scissors passed in
652 /// @param pScissors - array of scissors
653 SWR_FUNC(void, SwrSetScissorRects
,
655 uint32_t numScissors
,
656 const SWR_RECT
* pScissors
);
658 //////////////////////////////////////////////////////////////////////////
659 /// @brief Returns a pointer to the private context state for the current
660 /// draw operation. This is used for external componets such as the
663 /// @note Client needs to resend private state prior to each draw call.
664 /// Also, SWR is responsible for the private state memory.
665 /// @param hContext - Handle passed back from SwrCreateContext
666 SWR_FUNC(void*, SwrGetPrivateContextState
,
669 //////////////////////////////////////////////////////////////////////////
670 /// @brief Clients can use this to allocate memory for draw/dispatch
671 /// operations. The memory will automatically be freed once operation
672 /// has completed. Client can use this to allocate binding tables,
673 /// etc. needed for shader execution.
674 /// @param hContext - Handle passed back from SwrCreateContext
675 /// @param size - Size of allocation
676 /// @param align - Alignment needed for allocation.
677 SWR_FUNC(void*, SwrAllocDrawContextMemory
,
682 //////////////////////////////////////////////////////////////////////////
683 /// @brief Enables stats counting
684 /// @param hContext - Handle passed back from SwrCreateContext
685 /// @param enable - If true then counts are incremented.
686 SWR_FUNC(void, SwrEnableStatsFE
,
690 //////////////////////////////////////////////////////////////////////////
691 /// @brief Enables stats counting
692 /// @param hContext - Handle passed back from SwrCreateContext
693 /// @param enable - If true then counts are incremented.
694 SWR_FUNC(void, SwrEnableStatsBE
,
698 //////////////////////////////////////////////////////////////////////////
699 /// @brief Mark end of frame - used for performance profiling
700 /// @param hContext - Handle passed back from SwrCreateContext
701 SWR_FUNC(void, SwrEndFrame
,
704 //////////////////////////////////////////////////////////////////////////
705 /// @brief Initialize swr backend and memory internal tables
706 SWR_FUNC(void, SwrInit
);
709 //////////////////////////////////////////////////////////////////////////
710 /// @brief Loads a full hottile from a render surface
711 /// @param hPrivateContext - Handle to private DC
712 /// @param dstFormat - Format for hot tile.
713 /// @param renderTargetIndex - Index to src render target
714 /// @param x, y - Coordinates to raster tile.
715 /// @param pDstHotTile - Pointer to Hot Tile
716 SWR_FUNC(void, SwrLoadHotTile
,
717 const SWR_SURFACE_STATE
*pSrcSurface
,
718 SWR_FORMAT dstFormat
,
719 SWR_RENDERTARGET_ATTACHMENT renderTargetIndex
,
720 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
,
721 uint8_t *pDstHotTile
);
723 //////////////////////////////////////////////////////////////////////////
724 /// @brief Deswizzles and stores a full hottile to a render surface
725 /// @param hPrivateContext - Handle to private DC
726 /// @param srcFormat - Format for hot tile.
727 /// @param renderTargetIndex - Index to destination render target
728 /// @param x, y - Coordinates to raster tile.
729 /// @param pSrcHotTile - Pointer to Hot Tile
730 SWR_FUNC(void, SwrStoreHotTileToSurface
,
731 SWR_SURFACE_STATE
*pDstSurface
,
732 SWR_FORMAT srcFormat
,
733 SWR_RENDERTARGET_ATTACHMENT renderTargetIndex
,
734 uint32_t x
, uint32_t y
, uint32_t renderTargetArrayIndex
,
735 uint8_t *pSrcHotTile
);
737 //////////////////////////////////////////////////////////////////////////
738 /// @brief Writes clear color to every pixel of a render surface
739 /// @param hPrivateContext - Handle to private DC
740 /// @param renderTargetIndex - Index to destination render target
741 /// @param x, y - Coordinates to raster tile.
742 /// @param pClearColor - Pointer to clear color
743 SWR_FUNC(void, SwrStoreHotTileClear
,
744 SWR_SURFACE_STATE
*pDstSurface
,
745 SWR_RENDERTARGET_ATTACHMENT renderTargetIndex
,
748 uint32_t renderTargetArrayIndex
,
749 const float* pClearColor
);
753 PFNSwrCreateContext pfnSwrCreateContext
;
754 PFNSwrDestroyContext pfnSwrDestroyContext
;
755 PFNSwrBindApiThread pfnSwrBindApiThread
;
756 PFNSwrSaveState pfnSwrSaveState
;
757 PFNSwrRestoreState pfnSwrRestoreState
;
758 PFNSwrSync pfnSwrSync
;
759 PFNSwrStallBE pfnSwrStallBE
;
760 PFNSwrWaitForIdle pfnSwrWaitForIdle
;
761 PFNSwrWaitForIdleFE pfnSwrWaitForIdleFE
;
762 PFNSwrSetVertexBuffers pfnSwrSetVertexBuffers
;
763 PFNSwrSetIndexBuffer pfnSwrSetIndexBuffer
;
764 PFNSwrSetFetchFunc pfnSwrSetFetchFunc
;
765 PFNSwrSetSoFunc pfnSwrSetSoFunc
;
766 PFNSwrSetSoState pfnSwrSetSoState
;
767 PFNSwrSetSoBuffers pfnSwrSetSoBuffers
;
768 PFNSwrSetVertexFunc pfnSwrSetVertexFunc
;
769 PFNSwrSetFrontendState pfnSwrSetFrontendState
;
770 PFNSwrSetGsState pfnSwrSetGsState
;
771 PFNSwrSetGsFunc pfnSwrSetGsFunc
;
772 PFNSwrSetCsFunc pfnSwrSetCsFunc
;
773 PFNSwrSetTsState pfnSwrSetTsState
;
774 PFNSwrSetHsFunc pfnSwrSetHsFunc
;
775 PFNSwrSetDsFunc pfnSwrSetDsFunc
;
776 PFNSwrSetDepthStencilState pfnSwrSetDepthStencilState
;
777 PFNSwrSetBackendState pfnSwrSetBackendState
;
778 PFNSwrSetDepthBoundsState pfnSwrSetDepthBoundsState
;
779 PFNSwrSetPixelShaderState pfnSwrSetPixelShaderState
;
780 PFNSwrSetBlendState pfnSwrSetBlendState
;
781 PFNSwrSetBlendFunc pfnSwrSetBlendFunc
;
782 PFNSwrDraw pfnSwrDraw
;
783 PFNSwrDrawInstanced pfnSwrDrawInstanced
;
784 PFNSwrDrawIndexed pfnSwrDrawIndexed
;
785 PFNSwrDrawIndexedInstanced pfnSwrDrawIndexedInstanced
;
786 PFNSwrInvalidateTiles pfnSwrInvalidateTiles
;
787 PFNSwrDiscardRect pfnSwrDiscardRect
;
788 PFNSwrDispatch pfnSwrDispatch
;
789 PFNSwrStoreTiles pfnSwrStoreTiles
;
790 PFNSwrClearRenderTarget pfnSwrClearRenderTarget
;
791 PFNSwrSetRastState pfnSwrSetRastState
;
792 PFNSwrSetViewports pfnSwrSetViewports
;
793 PFNSwrSetScissorRects pfnSwrSetScissorRects
;
794 PFNSwrGetPrivateContextState pfnSwrGetPrivateContextState
;
795 PFNSwrAllocDrawContextMemory pfnSwrAllocDrawContextMemory
;
796 PFNSwrEnableStatsFE pfnSwrEnableStatsFE
;
797 PFNSwrEnableStatsBE pfnSwrEnableStatsBE
;
798 PFNSwrEndFrame pfnSwrEndFrame
;
799 PFNSwrInit pfnSwrInit
;
800 PFNSwrLoadHotTile pfnSwrLoadHotTile
;
801 PFNSwrStoreHotTileToSurface pfnSwrStoreHotTileToSurface
;
802 PFNSwrStoreHotTileClear pfnSwrStoreHotTileClear
;
806 typedef void (SWR_API
* PFNSwrGetInterface
)(SWR_INTERFACE
&out_funcs
);
807 SWR_VISIBLE
void SWR_API
SwrGetInterface(SWR_INTERFACE
&out_funcs
);