| /**************************************************************************** |
| * Copyright (C) 2014-2016 Intel Corporation. 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, sublicense, |
| * 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 above copyright notice and this permission notice (including the next |
| * paragraph) shall be included in all copies or substantial portions of the |
| * Software. |
| * |
| * 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 NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS 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. |
| * |
| * @file api.h |
| * |
| * @brief API definitions |
| * |
| ******************************************************************************/ |
| |
| #ifndef __SWR_API_H__ |
| #define __SWR_API_H__ |
| |
| #include "common/os.h" |
| |
| #include <assert.h> |
| #include <algorithm> |
| |
| #include "common/intrin.h" |
| #include "common/formats.h" |
| #include "core/state.h" |
| |
| typedef void(SWR_API *PFN_CALLBACK_FUNC)(uint64_t data, uint64_t data2, uint64_t data3); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Rectangle structure |
| struct SWR_RECT |
| { |
| int32_t xmin; ///< inclusive |
| int32_t ymin; ///< inclusive |
| int32_t xmax; ///< exclusive |
| int32_t ymax; ///< exclusive |
| |
| bool operator == (const SWR_RECT& rhs) |
| { |
| return (this->ymin == rhs.ymin && |
| this->ymax == rhs.ymax && |
| this->xmin == rhs.xmin && |
| this->xmax == rhs.xmax); |
| } |
| |
| bool operator != (const SWR_RECT& rhs) |
| { |
| return !(*this == rhs); |
| } |
| |
| SWR_RECT& Intersect(const SWR_RECT& other) |
| { |
| this->xmin = std::max(this->xmin, other.xmin); |
| this->ymin = std::max(this->ymin, other.ymin); |
| this->xmax = std::min(this->xmax, other.xmax); |
| this->ymax = std::min(this->ymax, other.ymax); |
| |
| if (xmax - xmin < 0 || |
| ymax - ymin < 0) |
| { |
| // Zero area |
| ymin = ymax = xmin = xmax = 0; |
| } |
| |
| return *this; |
| } |
| SWR_RECT& operator &= (const SWR_RECT& other) |
| { |
| return Intersect(other); |
| } |
| |
| SWR_RECT& Union(const SWR_RECT& other) |
| { |
| this->xmin = std::min(this->xmin, other.xmin); |
| this->ymin = std::min(this->ymin, other.ymin); |
| this->xmax = std::max(this->xmax, other.xmax); |
| this->ymax = std::max(this->ymax, other.ymax); |
| |
| return *this; |
| } |
| |
| SWR_RECT& operator |= (const SWR_RECT& other) |
| { |
| return Union(other); |
| } |
| |
| void Translate(int32_t x, int32_t y) |
| { |
| xmin += x; |
| ymin += y; |
| xmax += x; |
| ymax += y; |
| } |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Function signature for load hot tiles |
| /// @param hPrivateContext - handle to private data |
| /// @param dstFormat - format of the hot tile |
| /// @param renderTargetIndex - render target to store, can be color, depth or stencil |
| /// @param x - destination x coordinate |
| /// @param y - destination y coordinate |
| /// @param pDstHotTile - pointer to the hot tile surface |
| typedef void(SWR_API *PFN_LOAD_TILE)(HANDLE hPrivateContext, SWR_FORMAT dstFormat, |
| SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, |
| uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, uint8_t *pDstHotTile); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Function signature for store hot tiles |
| /// @param hPrivateContext - handle to private data |
| /// @param srcFormat - format of the hot tile |
| /// @param renderTargetIndex - render target to store, can be color, depth or stencil |
| /// @param x - destination x coordinate |
| /// @param y - destination y coordinate |
| /// @param pSrcHotTile - pointer to the hot tile surface |
| typedef void(SWR_API *PFN_STORE_TILE)(HANDLE hPrivateContext, SWR_FORMAT srcFormat, |
| SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, |
| uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, uint8_t *pSrcHotTile); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Function signature for clearing from the hot tiles clear value |
| /// @param hPrivateContext - handle to private data |
| /// @param renderTargetIndex - render target to store, can be color, depth or stencil |
| /// @param x - destination x coordinate |
| /// @param y - destination y coordinate |
| /// @param renderTargetArrayIndex - render target array offset from arrayIndex |
| /// @param pClearColor - pointer to the hot tile's clear value |
| typedef void(SWR_API *PFN_CLEAR_TILE)(HANDLE hPrivateContext, |
| SWR_RENDERTARGET_ATTACHMENT rtIndex, |
| uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, const float* pClearColor); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Callback to allow driver to update their copy of streamout write offset. |
| /// This is call is made for any draw operation that has streamout enabled |
| /// and has updated the write offset. |
| /// @param hPrivateContext - handle to private data |
| /// @param soBufferSlot - buffer slot for write offset |
| /// @param soWriteOffset - update value for so write offset. |
| typedef void(SWR_API *PFN_UPDATE_SO_WRITE_OFFSET)(HANDLE hPrivateContext, |
| uint32_t soBufferSlot, uint32_t soWriteOffset); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Callback to allow driver to update their copy of stats. |
| /// @param hPrivateContext - handle to private data |
| /// @param pStats - pointer to draw stats |
| typedef void(SWR_API *PFN_UPDATE_STATS)(HANDLE hPrivateContext, |
| const SWR_STATS* pStats); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Callback to allow driver to update their copy of FE stats. |
| /// @note Its optimal to have a separate callback for FE stats since |
| /// there is only one DC per FE thread. This means we do not have |
| /// to sum up the stats across all of the workers. |
| /// @param hPrivateContext - handle to private data |
| /// @param pStats - pointer to draw stats |
| typedef void(SWR_API *PFN_UPDATE_STATS_FE)(HANDLE hPrivateContext, |
| const SWR_STATS_FE* pStats); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// BucketManager |
| /// Forward Declaration (see rdtsc_buckets.h for full definition) |
| ///////////////////////////////////////////////////////////////////////// |
| class BucketManager; |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// SWR_THREADING_INFO |
| ///////////////////////////////////////////////////////////////////////// |
| struct SWR_THREADING_INFO |
| { |
| uint32_t BASE_NUMA_NODE; |
| uint32_t BASE_CORE; |
| uint32_t BASE_THREAD; |
| uint32_t MAX_WORKER_THREADS; |
| uint32_t MAX_NUMA_NODES; |
| uint32_t MAX_CORES_PER_NUMA_NODE; |
| uint32_t MAX_THREADS_PER_CORE; |
| bool SINGLE_THREADED; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// SWR_API_THREADING_INFO |
| /// Data used to reserve HW threads for API use |
| /// API Threads are reserved from numa nodes / cores used for |
| /// SWR Worker threads. Specifying reserved threads here can reduce |
| /// the total number of SWR worker threads. |
| ///////////////////////////////////////////////////////////////////////// |
| struct SWR_API_THREADING_INFO |
| { |
| uint32_t numAPIReservedThreads; // Default is 1 if SWR_API_THREADING_INFO is not sent |
| uint32_t bindAPIThread0; // Default is true if numAPIReservedThreads is > 0, |
| // binds thread used in SwrCreateContext to API Reserved |
| // thread 0 |
| uint32_t numAPIThreadsPerCore; // 0 - means use all threads per core, else clamp to this number. |
| // Independent of KNOB_MAX_THREADS_PER_CORE. |
| }; |
| |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// SWR_CREATECONTEXT_INFO |
| ///////////////////////////////////////////////////////////////////////// |
| struct SWR_CREATECONTEXT_INFO |
| { |
| // External functions (e.g. sampler) need per draw context state. |
| // Use SwrGetPrivateContextState() to access private state. |
| uint32_t privateStateSize; |
| |
| // Callback functions |
| PFN_LOAD_TILE pfnLoadTile; |
| PFN_STORE_TILE pfnStoreTile; |
| PFN_CLEAR_TILE pfnClearTile; |
| PFN_UPDATE_SO_WRITE_OFFSET pfnUpdateSoWriteOffset; |
| PFN_UPDATE_STATS pfnUpdateStats; |
| PFN_UPDATE_STATS_FE pfnUpdateStatsFE; |
| |
| |
| // Pointer to rdtsc buckets mgr returned to the caller. |
| // Only populated when KNOB_ENABLE_RDTSC is set |
| BucketManager* pBucketMgr; |
| |
| // Output: size required memory passed to for SwrSaveState / SwrRestoreState |
| size_t contextSaveSize; |
| |
| // ArchRast event manager. |
| HANDLE hArEventManager; |
| |
| // Input (optional): Threading info that overrides any set KNOB values. |
| SWR_THREADING_INFO* pThreadInfo; |
| |
| // Input (optional}: Info for reserving API threads |
| SWR_API_THREADING_INFO* pApiThreadInfo; |
| |
| // Input: if set to non-zero value, overrides KNOB value for maximum |
| // number of draws in flight |
| uint32_t MAX_DRAWS_IN_FLIGHT; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Create SWR Context. |
| /// @param pCreateInfo - pointer to creation info. |
| SWR_FUNC(HANDLE, SwrCreateContext, |
| SWR_CREATECONTEXT_INFO* pCreateInfo); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Destroys SWR Context. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| SWR_FUNC(void, SwrDestroyContext, |
| HANDLE hContext); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Bind current thread to an API reserved HW thread |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param apiThreadId - index of reserved HW thread to bind to. |
| SWR_FUNC(void, SwrBindApiThread, |
| HANDLE hContext, |
| uint32_t apiThreadId); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Saves API state associated with hContext |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pOutputStateBlock - Memory block to receive API state data |
| /// @param memSize - Size of memory pointed to by pOutputStateBlock |
| SWR_FUNC(void, SwrSaveState, |
| HANDLE hContext, |
| void* pOutputStateBlock, |
| size_t memSize); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Restores API state to hContext previously saved with SwrSaveState |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pStateBlock - Memory block to read API state data from |
| /// @param memSize - Size of memory pointed to by pStateBlock |
| SWR_FUNC(void, SwrRestoreState, |
| HANDLE hContext, |
| const void* pStateBlock, |
| size_t memSize); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Sync cmd. Executes the callback func when all rendering up to this sync |
| /// has been completed |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnFunc - pointer to callback function, |
| /// @param userData - user data to pass back |
| SWR_FUNC(void, SwrSync, |
| HANDLE hContext, |
| PFN_CALLBACK_FUNC pfnFunc, |
| uint64_t userData, |
| uint64_t userData2, |
| uint64_t userData3); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Stall cmd. Stalls the backend until all previous work has been completed. |
| /// Frontend work can continue to make progress |
| /// @param hContext - Handle passed back from SwrCreateContext |
| SWR_FUNC(void, SwrStallBE, |
| HANDLE hContext); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Blocks until all rendering has been completed. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| SWR_FUNC(void, SwrWaitForIdle, |
| HANDLE hContext); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Blocks until all FE rendering has been completed. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| SWR_FUNC(void, SwrWaitForIdleFE, |
| HANDLE hContext); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set vertex buffer state. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param numBuffers - Number of vertex buffer state descriptors. |
| /// @param pVertexBuffers - Array of vertex buffer state descriptors. |
| SWR_FUNC(void, SwrSetVertexBuffers, |
| HANDLE hContext, |
| uint32_t numBuffers, |
| const SWR_VERTEX_BUFFER_STATE* pVertexBuffers); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set index buffer |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pIndexBuffer - Index buffer. |
| SWR_FUNC(void, SwrSetIndexBuffer, |
| HANDLE hContext, |
| const SWR_INDEX_BUFFER_STATE* pIndexBuffer); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set fetch shader pointer. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnFetchFunc - Pointer to shader. |
| SWR_FUNC(void, SwrSetFetchFunc, |
| HANDLE hContext, |
| PFN_FETCH_FUNC pfnFetchFunc); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set streamout shader pointer. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnSoFunc - Pointer to shader. |
| /// @param streamIndex - specifies stream |
| SWR_FUNC(void, SwrSetSoFunc, |
| HANDLE hContext, |
| PFN_SO_FUNC pfnSoFunc, |
| uint32_t streamIndex); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set streamout state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pSoState - Pointer to streamout state. |
| SWR_FUNC(void, SwrSetSoState, |
| HANDLE hContext, |
| SWR_STREAMOUT_STATE* pSoState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set streamout buffer state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pSoBuffer - Pointer to streamout buffer. |
| /// @param slot - Slot to bind SO buffer to. |
| SWR_FUNC(void, SwrSetSoBuffers, |
| HANDLE hContext, |
| SWR_STREAMOUT_BUFFER* pSoBuffer, |
| uint32_t slot); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set vertex shader pointer. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnVertexFunc - Pointer to shader. |
| SWR_FUNC(void, SwrSetVertexFunc, |
| HANDLE hContext, |
| PFN_VERTEX_FUNC pfnVertexFunc); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set frontend state. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state |
| SWR_FUNC(void, SwrSetFrontendState, |
| HANDLE hContext, |
| SWR_FRONTEND_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set geometry shader state. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state |
| SWR_FUNC(void, SwrSetGsState, |
| HANDLE hContext, |
| SWR_GS_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set geometry shader |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to geometry shader function |
| SWR_FUNC(void, SwrSetGsFunc, |
| HANDLE hContext, |
| PFN_GS_FUNC pfnGsFunc); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set compute shader |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnCsFunc - Pointer to compute shader function |
| /// @param totalThreadsInGroup - product of thread group dimensions. |
| /// @param totalSpillFillSize - size in bytes needed for spill/fill. |
| /// @param scratchSpaceSizePerInstance - size of the scratch space needed per simd instance |
| /// @param numInstances - number of simd instances that are run per execution of the shader |
| SWR_FUNC(void, SwrSetCsFunc, |
| HANDLE hContext, |
| PFN_CS_FUNC pfnCsFunc, |
| uint32_t totalThreadsInGroup, |
| uint32_t totalSpillFillSize, |
| uint32_t scratchSpaceSizePerInstance, |
| uint32_t numInstances |
| ); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set tessellation state. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state |
| SWR_FUNC(void, SwrSetTsState, |
| HANDLE hContext, |
| SWR_TS_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set hull shader |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnFunc - Pointer to shader function |
| SWR_FUNC(void, SwrSetHsFunc, |
| HANDLE hContext, |
| PFN_HS_FUNC pfnFunc); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set domain shader |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pfnFunc - Pointer to shader function |
| SWR_FUNC(void, SwrSetDsFunc, |
| HANDLE hContext, |
| PFN_DS_FUNC pfnFunc); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set depth stencil state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state. |
| SWR_FUNC(void, SwrSetDepthStencilState, |
| HANDLE hContext, |
| SWR_DEPTH_STENCIL_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set backend state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state. |
| SWR_FUNC(void, SwrSetBackendState, |
| HANDLE hContext, |
| SWR_BACKEND_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set depth bounds state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state. |
| SWR_FUNC(void, SwrSetDepthBoundsState, |
| HANDLE hContext, |
| SWR_DEPTH_BOUNDS_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set pixel shader state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state. |
| SWR_FUNC(void, SwrSetPixelShaderState, |
| HANDLE hContext, |
| SWR_PS_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set blend state |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pState - Pointer to state. |
| SWR_FUNC(void, SwrSetBlendState, |
| HANDLE hContext, |
| SWR_BLEND_STATE *pState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Set blend function |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param renderTarget - render target index |
| /// @param pfnBlendFunc - function pointer |
| SWR_FUNC(void, SwrSetBlendFunc, |
| HANDLE hContext, |
| uint32_t renderTarget, |
| PFN_BLEND_JIT_FUNC pfnBlendFunc); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrDraw |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param topology - Specifies topology for draw. |
| /// @param startVertex - Specifies start vertex in vertex buffer for draw. |
| /// @param primCount - Number of vertices. |
| SWR_FUNC(void, SwrDraw, |
| HANDLE hContext, |
| PRIMITIVE_TOPOLOGY topology, |
| uint32_t startVertex, |
| uint32_t primCount); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrDrawInstanced |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param topology - Specifies topology for draw. |
| /// @param numVertsPerInstance - How many vertices to read sequentially from vertex data. |
| /// @param numInstances - How many instances to render. |
| /// @param startVertex - Specifies start vertex for draw. (vertex data) |
| /// @param startInstance - Which instance to start sequentially fetching from in each buffer (instanced data) |
| SWR_FUNC(void, SwrDrawInstanced, |
| HANDLE hContext, |
| PRIMITIVE_TOPOLOGY topology, |
| uint32_t numVertsPerInstance, |
| uint32_t numInstances, |
| uint32_t startVertex, |
| uint32_t startInstance); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief DrawIndexed |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param topology - Specifies topology for draw. |
| /// @param numIndices - Number of indices to read sequentially from index buffer. |
| /// @param indexOffset - Starting index into index buffer. |
| /// @param baseVertex - Vertex in vertex buffer to consider as index "0". Note value is signed. |
| SWR_FUNC(void, SwrDrawIndexed, |
| HANDLE hContext, |
| PRIMITIVE_TOPOLOGY topology, |
| uint32_t numIndices, |
| uint32_t indexOffset, |
| int32_t baseVertex); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrDrawIndexedInstanced |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param topology - Specifies topology for draw. |
| /// @param numIndices - Number of indices to read sequentially from index buffer. |
| /// @param numInstances - Number of instances to render. |
| /// @param indexOffset - Starting index into index buffer. |
| /// @param baseVertex - Vertex in vertex buffer to consider as index "0". Note value is signed. |
| /// @param startInstance - Which instance to start sequentially fetching from in each buffer (instanced data) |
| SWR_FUNC(void, SwrDrawIndexedInstanced, |
| HANDLE hContext, |
| PRIMITIVE_TOPOLOGY topology, |
| uint32_t numIndices, |
| uint32_t numInstances, |
| uint32_t indexOffset, |
| int32_t baseVertex, |
| uint32_t startInstance); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrInvalidateTiles |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param attachmentMask - The mask specifies which surfaces attached to the hottiles to invalidate. |
| /// @param invalidateRect - The pixel-coordinate rectangle to invalidate. This will be expanded to |
| /// be hottile size-aligned. |
| SWR_FUNC(void, SwrInvalidateTiles, |
| HANDLE hContext, |
| uint32_t attachmentMask, |
| const SWR_RECT& invalidateRect); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrDiscardRect |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param attachmentMask - The mask specifies which surfaces attached to the hottiles to discard. |
| /// @param rect - The pixel-coordinate rectangle to discard. Only fully-covered hottiles will be |
| /// discarded. |
| SWR_FUNC(void, SwrDiscardRect, |
| HANDLE hContext, |
| uint32_t attachmentMask, |
| const SWR_RECT& rect); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrDispatch |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param threadGroupCountX - Number of thread groups dispatched in X direction |
| /// @param threadGroupCountY - Number of thread groups dispatched in Y direction |
| /// @param threadGroupCountZ - Number of thread groups dispatched in Z direction |
| SWR_FUNC(void, SwrDispatch, |
| HANDLE hContext, |
| uint32_t threadGroupCountX, |
| uint32_t threadGroupCountY, |
| uint32_t threadGroupCountZ); |
| |
| |
| enum SWR_TILE_STATE |
| { |
| SWR_TILE_INVALID = 0, // tile is in unitialized state and should be loaded with surface contents before rendering |
| SWR_TILE_DIRTY = 2, // tile contains newer data than surface it represents |
| SWR_TILE_RESOLVED = 3, // is in sync with surface it represents |
| }; |
| |
| /// @todo Add a good description for what attachments are and when and why you would use the different SWR_TILE_STATEs. |
| SWR_FUNC(void, SwrStoreTiles, |
| HANDLE hContext, |
| uint32_t attachmentMask, |
| SWR_TILE_STATE postStoreTileState, |
| const SWR_RECT& storeRect); |
| |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrClearRenderTarget - Clear attached render targets / depth / stencil |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param attachmentMask - combination of SWR_ATTACHMENT_*_BIT attachments to clear |
| /// @param renderTargetArrayIndex - the RT array index to clear |
| /// @param clearColor - color use for clearing render targets |
| /// @param z - depth value use for clearing depth buffer |
| /// @param stencil - stencil value used for clearing stencil buffer |
| /// @param clearRect - The pixel-coordinate rectangle to clear in all cleared buffers |
| SWR_FUNC(void, SwrClearRenderTarget, |
| HANDLE hContext, |
| uint32_t attachmentMask, |
| uint32_t renderTargetArrayIndex, |
| const float clearColor[4], |
| float z, |
| uint8_t stencil, |
| const SWR_RECT& clearRect); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrSetRastState |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param pRastState - New SWR_RASTSTATE used for SwrDraw* commands |
| SWR_FUNC(void, SwrSetRastState, |
| HANDLE hContext, |
| const SWR_RASTSTATE *pRastState); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrSetViewports |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param numViewports - number of viewports passed in |
| /// @param pViewports - Specifies extents of viewport. |
| /// @param pMatrices - If not specified then SWR computes a default one. |
| SWR_FUNC(void, SwrSetViewports, |
| HANDLE hContext, |
| uint32_t numViewports, |
| const SWR_VIEWPORT* pViewports, |
| const SWR_VIEWPORT_MATRICES* pMatrices); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief SwrSetScissorRects |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param numScissors - number of scissors passed in |
| /// @param pScissors - array of scissors |
| SWR_FUNC(void, SwrSetScissorRects, |
| HANDLE hContext, |
| uint32_t numScissors, |
| const SWR_RECT* pScissors); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Returns a pointer to the private context state for the current |
| /// draw operation. This is used for external componets such as the |
| /// sampler. |
| /// |
| /// @note Client needs to resend private state prior to each draw call. |
| /// Also, SWR is responsible for the private state memory. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| SWR_FUNC(void*, SwrGetPrivateContextState, |
| HANDLE hContext); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Clients can use this to allocate memory for draw/dispatch |
| /// operations. The memory will automatically be freed once operation |
| /// has completed. Client can use this to allocate binding tables, |
| /// etc. needed for shader execution. |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param size - Size of allocation |
| /// @param align - Alignment needed for allocation. |
| SWR_FUNC(void*, SwrAllocDrawContextMemory, |
| HANDLE hContext, |
| uint32_t size, |
| uint32_t align); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Enables stats counting |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param enable - If true then counts are incremented. |
| SWR_FUNC(void, SwrEnableStatsFE, |
| HANDLE hContext, |
| bool enable); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Enables stats counting |
| /// @param hContext - Handle passed back from SwrCreateContext |
| /// @param enable - If true then counts are incremented. |
| SWR_FUNC(void, SwrEnableStatsBE, |
| HANDLE hContext, |
| bool enable); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Mark end of frame - used for performance profiling |
| /// @param hContext - Handle passed back from SwrCreateContext |
| SWR_FUNC(void, SwrEndFrame, |
| HANDLE hContext); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Initialize swr backend and memory internal tables |
| SWR_FUNC(void, SwrInit); |
| |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Loads a full hottile from a render surface |
| /// @param hPrivateContext - Handle to private DC |
| /// @param dstFormat - Format for hot tile. |
| /// @param renderTargetIndex - Index to src render target |
| /// @param x, y - Coordinates to raster tile. |
| /// @param pDstHotTile - Pointer to Hot Tile |
| SWR_FUNC(void, SwrLoadHotTile, |
| const SWR_SURFACE_STATE *pSrcSurface, |
| SWR_FORMAT dstFormat, |
| SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, |
| uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, |
| uint8_t *pDstHotTile); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Deswizzles and stores a full hottile to a render surface |
| /// @param hPrivateContext - Handle to private DC |
| /// @param srcFormat - Format for hot tile. |
| /// @param renderTargetIndex - Index to destination render target |
| /// @param x, y - Coordinates to raster tile. |
| /// @param pSrcHotTile - Pointer to Hot Tile |
| SWR_FUNC(void, SwrStoreHotTileToSurface, |
| SWR_SURFACE_STATE *pDstSurface, |
| SWR_FORMAT srcFormat, |
| SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, |
| uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, |
| uint8_t *pSrcHotTile); |
| |
| ////////////////////////////////////////////////////////////////////////// |
| /// @brief Writes clear color to every pixel of a render surface |
| /// @param hPrivateContext - Handle to private DC |
| /// @param renderTargetIndex - Index to destination render target |
| /// @param x, y - Coordinates to raster tile. |
| /// @param pClearColor - Pointer to clear color |
| SWR_FUNC(void, SwrStoreHotTileClear, |
| SWR_SURFACE_STATE *pDstSurface, |
| SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, |
| uint32_t x, |
| uint32_t y, |
| uint32_t renderTargetArrayIndex, |
| const float* pClearColor); |
| |
| struct SWR_INTERFACE |
| { |
| PFNSwrCreateContext pfnSwrCreateContext; |
| PFNSwrDestroyContext pfnSwrDestroyContext; |
| PFNSwrBindApiThread pfnSwrBindApiThread; |
| PFNSwrSaveState pfnSwrSaveState; |
| PFNSwrRestoreState pfnSwrRestoreState; |
| PFNSwrSync pfnSwrSync; |
| PFNSwrStallBE pfnSwrStallBE; |
| PFNSwrWaitForIdle pfnSwrWaitForIdle; |
| PFNSwrWaitForIdleFE pfnSwrWaitForIdleFE; |
| PFNSwrSetVertexBuffers pfnSwrSetVertexBuffers; |
| PFNSwrSetIndexBuffer pfnSwrSetIndexBuffer; |
| PFNSwrSetFetchFunc pfnSwrSetFetchFunc; |
| PFNSwrSetSoFunc pfnSwrSetSoFunc; |
| PFNSwrSetSoState pfnSwrSetSoState; |
| PFNSwrSetSoBuffers pfnSwrSetSoBuffers; |
| PFNSwrSetVertexFunc pfnSwrSetVertexFunc; |
| PFNSwrSetFrontendState pfnSwrSetFrontendState; |
| PFNSwrSetGsState pfnSwrSetGsState; |
| PFNSwrSetGsFunc pfnSwrSetGsFunc; |
| PFNSwrSetCsFunc pfnSwrSetCsFunc; |
| PFNSwrSetTsState pfnSwrSetTsState; |
| PFNSwrSetHsFunc pfnSwrSetHsFunc; |
| PFNSwrSetDsFunc pfnSwrSetDsFunc; |
| PFNSwrSetDepthStencilState pfnSwrSetDepthStencilState; |
| PFNSwrSetBackendState pfnSwrSetBackendState; |
| PFNSwrSetDepthBoundsState pfnSwrSetDepthBoundsState; |
| PFNSwrSetPixelShaderState pfnSwrSetPixelShaderState; |
| PFNSwrSetBlendState pfnSwrSetBlendState; |
| PFNSwrSetBlendFunc pfnSwrSetBlendFunc; |
| PFNSwrDraw pfnSwrDraw; |
| PFNSwrDrawInstanced pfnSwrDrawInstanced; |
| PFNSwrDrawIndexed pfnSwrDrawIndexed; |
| PFNSwrDrawIndexedInstanced pfnSwrDrawIndexedInstanced; |
| PFNSwrInvalidateTiles pfnSwrInvalidateTiles; |
| PFNSwrDiscardRect pfnSwrDiscardRect; |
| PFNSwrDispatch pfnSwrDispatch; |
| PFNSwrStoreTiles pfnSwrStoreTiles; |
| PFNSwrClearRenderTarget pfnSwrClearRenderTarget; |
| PFNSwrSetRastState pfnSwrSetRastState; |
| PFNSwrSetViewports pfnSwrSetViewports; |
| PFNSwrSetScissorRects pfnSwrSetScissorRects; |
| PFNSwrGetPrivateContextState pfnSwrGetPrivateContextState; |
| PFNSwrAllocDrawContextMemory pfnSwrAllocDrawContextMemory; |
| PFNSwrEnableStatsFE pfnSwrEnableStatsFE; |
| PFNSwrEnableStatsBE pfnSwrEnableStatsBE; |
| PFNSwrEndFrame pfnSwrEndFrame; |
| PFNSwrInit pfnSwrInit; |
| PFNSwrLoadHotTile pfnSwrLoadHotTile; |
| PFNSwrStoreHotTileToSurface pfnSwrStoreHotTileToSurface; |
| PFNSwrStoreHotTileClear pfnSwrStoreHotTileClear; |
| }; |
| |
| extern "C" { |
| typedef void (SWR_API * PFNSwrGetInterface)(SWR_INTERFACE &out_funcs); |
| SWR_VISIBLE void SWR_API SwrGetInterface(SWR_INTERFACE &out_funcs); |
| } |
| |
| #endif |