Home | History | Annotate | Download | only in core
      1 /****************************************************************************
      2 * Copyright (C) 2014-2016 Intel Corporation.   All Rights Reserved.
      3 *
      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:
     10 *
     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
     13 * Software.
     14 *
     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
     21 * IN THE SOFTWARE.
     22 *
     23 * @file api.h
     24 *
     25 * @brief API definitions
     26 *
     27 ******************************************************************************/
     28 
     29 #ifndef __SWR_API_H__
     30 #define __SWR_API_H__
     31 
     32 #include "common/os.h"
     33 
     34 #include <assert.h>
     35 #include <algorithm>
     36 
     37 #include "common/intrin.h"
     38 #include "common/formats.h"
     39 #include "core/state.h"
     40 
     41 typedef void(SWR_API *PFN_CALLBACK_FUNC)(uint64_t data, uint64_t data2, uint64_t data3);
     42 
     43 //////////////////////////////////////////////////////////////////////////
     44 /// @brief Rectangle structure
     45 struct SWR_RECT
     46 {
     47     int32_t xmin; ///< inclusive
     48     int32_t ymin; ///< inclusive
     49     int32_t xmax; ///< exclusive
     50     int32_t ymax; ///< exclusive
     51 
     52     bool operator == (const SWR_RECT& rhs)
     53     {
     54         return (this->ymin == rhs.ymin &&
     55             this->ymax == rhs.ymax &&
     56             this->xmin == rhs.xmin &&
     57             this->xmax == rhs.xmax);
     58     }
     59 
     60     bool operator != (const SWR_RECT& rhs)
     61     {
     62         return !(*this == rhs);
     63     }
     64 
     65     SWR_RECT& Intersect(const SWR_RECT& other)
     66     {
     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);
     71 
     72         if (xmax - xmin < 0 ||
     73             ymax - ymin < 0)
     74         {
     75             // Zero area
     76             ymin = ymax = xmin = xmax = 0;
     77         }
     78 
     79         return *this;
     80     }
     81     SWR_RECT& operator &= (const SWR_RECT& other)
     82     {
     83         return Intersect(other);
     84     }
     85 
     86     SWR_RECT& Union(const SWR_RECT& other)
     87     {
     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);
     92 
     93         return *this;
     94     }
     95 
     96     SWR_RECT& operator |= (const SWR_RECT& other)
     97     {
     98         return Union(other);
     99     }
    100 
    101     void Translate(int32_t x, int32_t y)
    102     {
    103         xmin += x;
    104         ymin += y;
    105         xmax += x;
    106         ymax += y;
    107     }
    108 };
    109 
    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);
    121 
    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);
    133 
    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);
    145 
    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);
    155 
    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);
    162 
    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);
    172 
    173 //////////////////////////////////////////////////////////////////////////
    174 /// BucketManager
    175 /// Forward Declaration (see rdtsc_buckets.h for full definition)
    176 /////////////////////////////////////////////////////////////////////////
    177 class BucketManager;
    178 
    179 //////////////////////////////////////////////////////////////////////////
    180 /// SWR_THREADING_INFO
    181 /////////////////////////////////////////////////////////////////////////
    182 struct SWR_THREADING_INFO
    183 {
    184     uint32_t    BASE_NUMA_NODE;
    185     uint32_t    BASE_CORE;
    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;
    192 };
    193 
    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
    202 {
    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
    206                                     // thread 0
    207     uint32_t numAPIThreadsPerCore;  // 0 - means use all threads per core, else clamp to this number.
    208                                     // Independent of KNOB_MAX_THREADS_PER_CORE.
    209 };
    210 
    211 
    212 //////////////////////////////////////////////////////////////////////////
    213 /// SWR_CREATECONTEXT_INFO
    214 /////////////////////////////////////////////////////////////////////////
    215 struct SWR_CREATECONTEXT_INFO
    216 {
    217     // External functions (e.g. sampler) need per draw context state.
    218     // Use SwrGetPrivateContextState() to access private state.
    219     uint32_t privateStateSize;
    220 
    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;
    228 
    229 
    230     // Pointer to rdtsc buckets mgr returned to the caller.
    231     // Only populated when KNOB_ENABLE_RDTSC is set
    232     BucketManager* pBucketMgr;
    233 
    234     // Output: size required memory passed to for SwrSaveState / SwrRestoreState
    235     size_t  contextSaveSize;
    236 
    237     // ArchRast event manager.
    238     HANDLE  hArEventManager;
    239 
    240     // Input (optional): Threading info that overrides any set KNOB values.
    241     SWR_THREADING_INFO* pThreadInfo;
    242 
    243     // Input (optional}: Info for reserving API threads
    244     SWR_API_THREADING_INFO* pApiThreadInfo;
    245 
    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;
    249 };
    250 
    251 //////////////////////////////////////////////////////////////////////////
    252 /// @brief Create SWR Context.
    253 /// @param pCreateInfo - pointer to creation info.
    254 SWR_FUNC(HANDLE, SwrCreateContext,
    255     SWR_CREATECONTEXT_INFO* pCreateInfo);
    256 
    257 //////////////////////////////////////////////////////////////////////////
    258 /// @brief Destroys SWR Context.
    259 /// @param hContext - Handle passed back from SwrCreateContext
    260 SWR_FUNC(void, SwrDestroyContext,
    261     HANDLE hContext);
    262 
    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,
    268     HANDLE hContext,
    269     uint32_t apiThreadId);
    270 
    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,
    277     HANDLE hContext,
    278     void* pOutputStateBlock,
    279     size_t memSize);
    280 
    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,
    287     HANDLE hContext,
    288     const void* pStateBlock,
    289     size_t memSize);
    290 
    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,
    298     HANDLE hContext,
    299     PFN_CALLBACK_FUNC pfnFunc,
    300     uint64_t userData,
    301     uint64_t userData2,
    302     uint64_t userData3);
    303 
    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,
    309     HANDLE hContext);
    310 
    311 //////////////////////////////////////////////////////////////////////////
    312 /// @brief Blocks until all rendering has been completed.
    313 /// @param hContext - Handle passed back from SwrCreateContext
    314 SWR_FUNC(void, SwrWaitForIdle,
    315     HANDLE hContext);
    316 
    317 //////////////////////////////////////////////////////////////////////////
    318 /// @brief Blocks until all FE rendering has been completed.
    319 /// @param hContext - Handle passed back from SwrCreateContext
    320 SWR_FUNC(void, SwrWaitForIdleFE,
    321     HANDLE hContext);
    322 
    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,
    329     HANDLE hContext,
    330     uint32_t numBuffers,
    331     const SWR_VERTEX_BUFFER_STATE* pVertexBuffers);
    332 
    333 //////////////////////////////////////////////////////////////////////////
    334 /// @brief Set index buffer
    335 /// @param hContext - Handle passed back from SwrCreateContext
    336 /// @param pIndexBuffer - Index buffer.
    337 SWR_FUNC(void, SwrSetIndexBuffer,
    338     HANDLE hContext,
    339     const SWR_INDEX_BUFFER_STATE* pIndexBuffer);
    340 
    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,
    346     HANDLE hContext,
    347     PFN_FETCH_FUNC    pfnFetchFunc);
    348 
    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,
    355     HANDLE hContext,
    356     PFN_SO_FUNC    pfnSoFunc,
    357     uint32_t streamIndex);
    358 
    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,
    364     HANDLE hContext,
    365     SWR_STREAMOUT_STATE* pSoState);
    366 
    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,
    373     HANDLE hContext,
    374     SWR_STREAMOUT_BUFFER* pSoBuffer,
    375     uint32_t slot);
    376 
    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,
    382     HANDLE hContext,
    383     PFN_VERTEX_FUNC pfnVertexFunc);
    384 
    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,
    390     HANDLE hContext,
    391     SWR_FRONTEND_STATE *pState);
    392 
    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,
    398     HANDLE hContext,
    399     SWR_GS_STATE *pState);
    400 
    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,
    406     HANDLE hContext,
    407     PFN_GS_FUNC pfnGsFunc);
    408 
    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,
    418     HANDLE hContext,
    419     PFN_CS_FUNC pfnCsFunc,
    420     uint32_t totalThreadsInGroup,
    421     uint32_t totalSpillFillSize,
    422     uint32_t scratchSpaceSizePerInstance,
    423     uint32_t numInstances
    424     );
    425 
    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,
    431     HANDLE hContext,
    432     SWR_TS_STATE *pState);
    433 
    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,
    439     HANDLE hContext,
    440     PFN_HS_FUNC pfnFunc);
    441 
    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,
    447     HANDLE hContext,
    448     PFN_DS_FUNC pfnFunc);
    449 
    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,
    455     HANDLE hContext,
    456     SWR_DEPTH_STENCIL_STATE *pState);
    457 
    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,
    463     HANDLE hContext,
    464     SWR_BACKEND_STATE *pState);
    465 
    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,
    471     HANDLE hContext,
    472     SWR_DEPTH_BOUNDS_STATE *pState);
    473 
    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,
    479     HANDLE hContext,
    480     SWR_PS_STATE *pState);
    481 
    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,
    487     HANDLE hContext,
    488     SWR_BLEND_STATE *pState);
    489 
    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,
    496     HANDLE hContext,
    497     uint32_t renderTarget,
    498     PFN_BLEND_JIT_FUNC pfnBlendFunc);
    499 
    500 //////////////////////////////////////////////////////////////////////////
    501 /// @brief SwrDraw
    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,
    507     HANDLE hContext,
    508     PRIMITIVE_TOPOLOGY topology,
    509     uint32_t startVertex,
    510     uint32_t primCount);
    511 
    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,
    521     HANDLE hContext,
    522     PRIMITIVE_TOPOLOGY topology,
    523     uint32_t numVertsPerInstance,
    524     uint32_t numInstances,
    525     uint32_t startVertex,
    526     uint32_t startInstance);
    527 
    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,
    536     HANDLE hContext,
    537     PRIMITIVE_TOPOLOGY topology,
    538     uint32_t numIndices,
    539     uint32_t indexOffset,
    540     int32_t baseVertex);
    541 
    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,
    552     HANDLE hContext,
    553     PRIMITIVE_TOPOLOGY topology,
    554     uint32_t numIndices,
    555     uint32_t numInstances,
    556     uint32_t indexOffset,
    557     int32_t baseVertex,
    558     uint32_t startInstance);
    559 
    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,
    567     HANDLE hContext,
    568     uint32_t attachmentMask,
    569     const SWR_RECT& invalidateRect);
    570 
    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
    576 ///               discarded.
    577 SWR_FUNC(void, SwrDiscardRect,
    578     HANDLE hContext,
    579     uint32_t attachmentMask,
    580     const SWR_RECT& rect);
    581 
    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,
    589     HANDLE hContext,
    590     uint32_t threadGroupCountX,
    591     uint32_t threadGroupCountY,
    592     uint32_t threadGroupCountZ);
    593 
    594 
    595 enum SWR_TILE_STATE
    596 {
    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
    600 };
    601 
    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,
    604     HANDLE hContext,
    605     uint32_t attachmentMask,
    606     SWR_TILE_STATE postStoreTileState,
    607     const SWR_RECT& storeRect);
    608 
    609 
    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,
    620     HANDLE hContext,
    621     uint32_t attachmentMask,
    622     uint32_t renderTargetArrayIndex,
    623     const float clearColor[4],
    624     float z,
    625     uint8_t stencil,
    626     const SWR_RECT& clearRect);
    627 
    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,
    633     HANDLE hContext,
    634     const SWR_RASTSTATE *pRastState);
    635 
    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,
    643     HANDLE hContext,
    644     uint32_t numViewports,
    645     const SWR_VIEWPORT* pViewports,
    646     const SWR_VIEWPORT_MATRICES* pMatrices);
    647 
    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,
    654     HANDLE hContext,
    655     uint32_t numScissors,
    656     const SWR_RECT* pScissors);
    657 
    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
    661 ///        sampler.
    662 ///
    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,
    667     HANDLE hContext);
    668 
    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,
    678     HANDLE hContext,
    679     uint32_t size,
    680     uint32_t align);
    681 
    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,
    687     HANDLE hContext,
    688     bool enable);
    689 
    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,
    695     HANDLE hContext,
    696     bool enable);
    697 
    698 //////////////////////////////////////////////////////////////////////////
    699 /// @brief Mark end of frame - used for performance profiling
    700 /// @param hContext - Handle passed back from SwrCreateContext
    701 SWR_FUNC(void, SwrEndFrame,
    702     HANDLE hContext);
    703 
    704 //////////////////////////////////////////////////////////////////////////
    705 /// @brief Initialize swr backend and memory internal tables
    706 SWR_FUNC(void, SwrInit);
    707 
    708 
    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);
    722 
    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);
    736 
    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,
    746          uint32_t x,
    747          uint32_t y,
    748          uint32_t renderTargetArrayIndex,
    749          const float* pClearColor);
    750 
    751 struct SWR_INTERFACE
    752 {
    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;
    803 };
    804 
    805 extern "C" {
    806 typedef void (SWR_API * PFNSwrGetInterface)(SWR_INTERFACE &out_funcs);
    807 SWR_VISIBLE void SWR_API SwrGetInterface(SWR_INTERFACE &out_funcs);
    808 }
    809 
    810 #endif
    811