Home | History | Annotate | Download | only in addrlib
      1 /*
      2  * Copyright  2014 Advanced Micro Devices, Inc.
      3  * All Rights Reserved.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining
      6  * a copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     14  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     15  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     16  * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
     17  * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     20  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     21  *
     22  * The above copyright notice and this permission notice (including the
     23  * next paragraph) shall be included in all copies or substantial portions
     24  * of the Software.
     25  */
     26 
     27 /**
     28 ***************************************************************************************************
     29 * @file  addrinterface.cpp
     30 * @brief Contains the addrlib interface functions
     31 ***************************************************************************************************
     32 */
     33 #include "addrinterface.h"
     34 #include "addrlib.h"
     35 
     36 #include "addrcommon.h"
     37 
     38 ///////////////////////////////////////////////////////////////////////////////////////////////////
     39 //                               Create/Destroy/Config functions
     40 ///////////////////////////////////////////////////////////////////////////////////////////////////
     41 
     42 /**
     43 ***************************************************************************************************
     44 *   AddrCreate
     45 *
     46 *   @brief
     47 *       Create address lib object
     48 *
     49 *   @return
     50 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
     51 ***************************************************************************************************
     52 */
     53 ADDR_E_RETURNCODE ADDR_API AddrCreate(
     54     const ADDR_CREATE_INPUT*    pAddrCreateIn,  ///< [in] infomation for creating address lib object
     55     ADDR_CREATE_OUTPUT*         pAddrCreateOut) ///< [out] address lib handle
     56 {
     57     ADDR_E_RETURNCODE returnCode = ADDR_OK;
     58 
     59     returnCode = AddrLib::Create(pAddrCreateIn, pAddrCreateOut);
     60 
     61     return returnCode;
     62 }
     63 
     64 
     65 
     66 /**
     67 ***************************************************************************************************
     68 *   AddrDestroy
     69 *
     70 *   @brief
     71 *       Destroy address lib object
     72 *
     73 *   @return
     74 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
     75 ***************************************************************************************************
     76 */
     77 ADDR_E_RETURNCODE ADDR_API AddrDestroy(
     78     ADDR_HANDLE hLib) ///< [in] address lib handle
     79 {
     80     ADDR_E_RETURNCODE returnCode = ADDR_OK;
     81 
     82     if (hLib)
     83     {
     84         AddrLib* pLib = AddrLib::GetAddrLib(hLib);
     85         pLib->Destroy();
     86     }
     87     else
     88     {
     89         returnCode = ADDR_ERROR;
     90     }
     91 
     92     return returnCode;
     93 }
     94 
     95 
     96 
     97 ///////////////////////////////////////////////////////////////////////////////////////////////////
     98 //                                    Surface functions
     99 ///////////////////////////////////////////////////////////////////////////////////////////////////
    100 
    101 /**
    102 ***************************************************************************************************
    103 *   AddrComputeSurfaceInfo
    104 *
    105 *   @brief
    106 *       Calculate surface width/height/depth/alignments and suitable tiling mode
    107 *
    108 *   @return
    109 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    110 ***************************************************************************************************
    111 */
    112 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceInfo(
    113     ADDR_HANDLE                             hLib, ///< [in] address lib handle
    114     const ADDR_COMPUTE_SURFACE_INFO_INPUT*  pIn,  ///< [in] surface information
    115     ADDR_COMPUTE_SURFACE_INFO_OUTPUT*       pOut) ///< [out] surface parameters and alignments
    116 {
    117     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    118 
    119     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    120 
    121     if (pLib != NULL)
    122     {
    123         returnCode = pLib->ComputeSurfaceInfo(pIn, pOut);
    124     }
    125     else
    126     {
    127         returnCode = ADDR_ERROR;
    128     }
    129 
    130     return returnCode;
    131 }
    132 
    133 
    134 
    135 /**
    136 ***************************************************************************************************
    137 *   AddrComputeSurfaceAddrFromCoord
    138 *
    139 *   @brief
    140 *       Compute surface address according to coordinates
    141 *
    142 *   @return
    143 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    144 ***************************************************************************************************
    145 */
    146 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceAddrFromCoord(
    147     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    148     const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,  ///< [in] surface info and coordinates
    149     ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT*      pOut) ///< [out] surface address
    150 {
    151     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    152 
    153     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    154 
    155     if (pLib != NULL)
    156     {
    157         returnCode = pLib->ComputeSurfaceAddrFromCoord(pIn, pOut);
    158     }
    159     else
    160     {
    161         returnCode = ADDR_ERROR;
    162     }
    163 
    164     return returnCode;
    165 }
    166 
    167 /**
    168 ***************************************************************************************************
    169 *   AddrComputeSurfaceCoordFromAddr
    170 *
    171 *   @brief
    172 *       Compute coordinates according to surface address
    173 *
    174 *   @return
    175 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    176 ***************************************************************************************************
    177 */
    178 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceCoordFromAddr(
    179     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    180     const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,  ///< [in] surface info and address
    181     ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT*      pOut) ///< [out] coordinates
    182 {
    183     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    184 
    185     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    186 
    187     if (pLib != NULL)
    188     {
    189         returnCode = pLib->ComputeSurfaceCoordFromAddr(pIn, pOut);
    190     }
    191     else
    192     {
    193         returnCode = ADDR_ERROR;
    194     }
    195 
    196     return returnCode;
    197 }
    198 
    199 
    200 
    201 ///////////////////////////////////////////////////////////////////////////////////////////////////
    202 //                                   HTile functions
    203 ///////////////////////////////////////////////////////////////////////////////////////////////////
    204 
    205 /**
    206 ***************************************************************************************************
    207 *   AddrComputeHtileInfo
    208 *
    209 *   @brief
    210 *       Compute Htile pitch, height, base alignment and size in bytes
    211 *
    212 *   @return
    213 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    214 ***************************************************************************************************
    215 */
    216 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileInfo(
    217     ADDR_HANDLE                             hLib, ///< [in] address lib handle
    218     const ADDR_COMPUTE_HTILE_INFO_INPUT*    pIn,  ///< [in] Htile information
    219     ADDR_COMPUTE_HTILE_INFO_OUTPUT*         pOut) ///< [out] Htile pitch, height and size in bytes
    220 {
    221     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    222 
    223     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    224 
    225     if (pLib != NULL)
    226     {
    227         returnCode = pLib->ComputeHtileInfo(pIn, pOut);
    228     }
    229     else
    230     {
    231         returnCode = ADDR_ERROR;
    232     }
    233 
    234     return returnCode;
    235 }
    236 
    237 /**
    238 ***************************************************************************************************
    239 *   AddrComputeHtileAddrFromCoord
    240 *
    241 *   @brief
    242 *       Compute Htile address according to coordinates (of depth buffer)
    243 *
    244 *   @return
    245 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    246 ***************************************************************************************************
    247 */
    248 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileAddrFromCoord(
    249     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    250     const ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT*   pIn,  ///< [in] Htile info and coordinates
    251     ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT*        pOut) ///< [out] Htile address
    252 {
    253     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    254 
    255     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    256 
    257     if (pLib != NULL)
    258     {
    259         returnCode = pLib->ComputeHtileAddrFromCoord(pIn, pOut);
    260     }
    261     else
    262     {
    263         returnCode = ADDR_ERROR;
    264     }
    265 
    266     return returnCode;
    267 }
    268 
    269 /**
    270 ***************************************************************************************************
    271 *   AddrComputeHtileCoordFromAddr
    272 *
    273 *   @brief
    274 *       Compute coordinates within depth buffer (1st pixel of a micro tile) according to
    275 *       Htile address
    276 *
    277 *   @return
    278 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    279 ***************************************************************************************************
    280 */
    281 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileCoordFromAddr(
    282     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    283     const ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT*   pIn,  ///< [in] Htile info and address
    284     ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT*        pOut) ///< [out] Htile coordinates
    285 {
    286     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    287 
    288     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    289 
    290     if (pLib != NULL)
    291     {
    292         returnCode = pLib->ComputeHtileCoordFromAddr(pIn, pOut);
    293     }
    294     else
    295     {
    296         returnCode = ADDR_ERROR;
    297     }
    298 
    299     return returnCode;
    300 }
    301 
    302 
    303 
    304 ///////////////////////////////////////////////////////////////////////////////////////////////////
    305 //                                     C-mask functions
    306 ///////////////////////////////////////////////////////////////////////////////////////////////////
    307 
    308 /**
    309 ***************************************************************************************************
    310 *   AddrComputeCmaskInfo
    311 *
    312 *   @brief
    313 *       Compute Cmask pitch, height, base alignment and size in bytes from color buffer
    314 *       info
    315 *
    316 *   @return
    317 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    318 ***************************************************************************************************
    319 */
    320 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskInfo(
    321     ADDR_HANDLE                             hLib, ///< [in] address lib handle
    322     const ADDR_COMPUTE_CMASK_INFO_INPUT*    pIn,  ///< [in] Cmask pitch and height
    323     ADDR_COMPUTE_CMASK_INFO_OUTPUT*         pOut) ///< [out] Cmask pitch, height and size in bytes
    324 {
    325     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    326 
    327     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    328 
    329     if (pLib != NULL)
    330     {
    331         returnCode = pLib->ComputeCmaskInfo(pIn, pOut);
    332     }
    333     else
    334     {
    335         returnCode = ADDR_ERROR;
    336     }
    337 
    338     return returnCode;
    339 }
    340 
    341 /**
    342 ***************************************************************************************************
    343 *   AddrComputeCmaskAddrFromCoord
    344 *
    345 *   @brief
    346 *       Compute Cmask address according to coordinates (of MSAA color buffer)
    347 *
    348 *   @return
    349 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    350 ***************************************************************************************************
    351 */
    352 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskAddrFromCoord(
    353     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    354     const ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT*   pIn,  ///< [in] Cmask info and coordinates
    355     ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT*        pOut) ///< [out] Cmask address
    356 {
    357     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    358 
    359     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    360 
    361     if (pLib != NULL)
    362     {
    363         returnCode = pLib->ComputeCmaskAddrFromCoord(pIn, pOut);
    364     }
    365     else
    366     {
    367         returnCode = ADDR_ERROR;
    368     }
    369 
    370     return returnCode;
    371 }
    372 
    373 /**
    374 ***************************************************************************************************
    375 *   AddrComputeCmaskCoordFromAddr
    376 *
    377 *   @brief
    378 *       Compute coordinates within color buffer (1st pixel of a micro tile) according to
    379 *       Cmask address
    380 *
    381 *   @return
    382 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    383 ***************************************************************************************************
    384 */
    385 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskCoordFromAddr(
    386     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    387     const ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT*   pIn,  ///< [in] Cmask info and address
    388     ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT*        pOut) ///< [out] Cmask coordinates
    389 {
    390     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    391 
    392     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    393 
    394     if (pLib != NULL)
    395     {
    396         returnCode = pLib->ComputeCmaskCoordFromAddr(pIn, pOut);
    397     }
    398     else
    399     {
    400         returnCode = ADDR_ERROR;
    401     }
    402 
    403     return returnCode;
    404 }
    405 
    406 
    407 
    408 ///////////////////////////////////////////////////////////////////////////////////////////////////
    409 //                                     F-mask functions
    410 ///////////////////////////////////////////////////////////////////////////////////////////////////
    411 
    412 /**
    413 ***************************************************************************************************
    414 *   AddrComputeFmaskInfo
    415 *
    416 *   @brief
    417 *       Compute Fmask pitch/height/depth/alignments and size in bytes
    418 *
    419 *   @return
    420 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    421 ***************************************************************************************************
    422 */
    423 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskInfo(
    424     ADDR_HANDLE                             hLib, ///< [in] address lib handle
    425     const ADDR_COMPUTE_FMASK_INFO_INPUT*    pIn,  ///< [in] Fmask information
    426     ADDR_COMPUTE_FMASK_INFO_OUTPUT*         pOut) ///< [out] Fmask pitch and height
    427 {
    428     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    429 
    430     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    431 
    432     if (pLib != NULL)
    433     {
    434         returnCode = pLib->ComputeFmaskInfo(pIn, pOut);
    435     }
    436     else
    437     {
    438         returnCode = ADDR_ERROR;
    439     }
    440 
    441     return returnCode;
    442 }
    443 
    444 /**
    445 ***************************************************************************************************
    446 *   AddrComputeFmaskAddrFromCoord
    447 *
    448 *   @brief
    449 *       Compute Fmask address according to coordinates (x,y,slice,sample,plane)
    450 *
    451 *   @return
    452 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    453 ***************************************************************************************************
    454 */
    455 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskAddrFromCoord(
    456     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    457     const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT*   pIn,  ///< [in] Fmask info and coordinates
    458     ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT*        pOut) ///< [out] Fmask address
    459 {
    460     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    461 
    462     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    463 
    464     if (pLib != NULL)
    465     {
    466         returnCode = pLib->ComputeFmaskAddrFromCoord(pIn, pOut);
    467     }
    468     else
    469     {
    470         returnCode = ADDR_ERROR;
    471     }
    472 
    473     return returnCode;
    474 }
    475 
    476 /**
    477 ***************************************************************************************************
    478 *   AddrComputeFmaskCoordFromAddr
    479 *
    480 *   @brief
    481 *       Compute coordinates (x,y,slice,sample,plane) according to Fmask address
    482 *
    483 *   @return
    484 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    485 ***************************************************************************************************
    486 */
    487 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskCoordFromAddr(
    488     ADDR_HANDLE                                     hLib, ///< [in] address lib handle
    489     const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT*   pIn,  ///< [in] Fmask info and address
    490     ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT*        pOut) ///< [out] Fmask coordinates
    491 {
    492     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    493 
    494     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    495 
    496     if (pLib != NULL)
    497     {
    498         returnCode = pLib->ComputeFmaskCoordFromAddr(pIn, pOut);
    499     }
    500     else
    501     {
    502         returnCode = ADDR_ERROR;
    503     }
    504 
    505     return returnCode;
    506 }
    507 
    508 
    509 
    510 ///////////////////////////////////////////////////////////////////////////////////////////////////
    511 //                                     DCC key functions
    512 ///////////////////////////////////////////////////////////////////////////////////////////////////
    513 
    514 /**
    515 ***************************************************************************************************
    516 *   AddrComputeDccInfo
    517 *
    518 *   @brief
    519 *       Compute DCC key size, base alignment based on color surface size, tile info or tile index
    520 *
    521 ***************************************************************************************************
    522 */
    523 ADDR_E_RETURNCODE ADDR_API AddrComputeDccInfo(
    524     ADDR_HANDLE                             hLib,   ///< [in] handle of addrlib
    525     const ADDR_COMPUTE_DCCINFO_INPUT*       pIn,    ///< [in] input
    526     ADDR_COMPUTE_DCCINFO_OUTPUT*            pOut)   ///< [out] output
    527 {
    528     ADDR_E_RETURNCODE returnCode;
    529 
    530     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    531 
    532     if (pLib != NULL)
    533     {
    534        returnCode = pLib->ComputeDccInfo(pIn, pOut);
    535     }
    536     else
    537     {
    538        returnCode = ADDR_ERROR;
    539     }
    540 
    541     return returnCode;
    542 }
    543 
    544 
    545 
    546 ///////////////////////////////////////////////////////////////////////////////
    547 // Below functions are element related or helper functions
    548 ///////////////////////////////////////////////////////////////////////////////
    549 
    550 /**
    551 ***************************************************************************************************
    552 *   AddrGetVersion
    553 *
    554 *   @brief
    555 *       Get AddrLib version number. Client may check this return value against ADDRLIB_VERSION
    556 *       defined in addrinterface.h to see if there is a mismatch.
    557 ***************************************************************************************************
    558 */
    559 UINT_32 ADDR_API AddrGetVersion(ADDR_HANDLE hLib)
    560 {
    561     UINT_32 version = 0;
    562 
    563     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    564 
    565     ADDR_ASSERT(pLib != NULL);
    566 
    567     if (pLib)
    568     {
    569         version = pLib->GetVersion();
    570     }
    571 
    572     return version;
    573 }
    574 
    575 /**
    576 ***************************************************************************************************
    577 *   AddrUseTileIndex
    578 *
    579 *   @brief
    580 *       Return TRUE if tileIndex is enabled in this address library
    581 ***************************************************************************************************
    582 */
    583 BOOL_32 ADDR_API AddrUseTileIndex(ADDR_HANDLE hLib)
    584 {
    585     BOOL_32 useTileIndex = FALSE;
    586 
    587     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    588 
    589     ADDR_ASSERT(pLib != NULL);
    590 
    591     if (pLib)
    592     {
    593         useTileIndex = pLib->UseTileIndex(0);
    594     }
    595 
    596     return useTileIndex;
    597 }
    598 
    599 /**
    600 ***************************************************************************************************
    601 *   AddrUseCombinedSwizzle
    602 *
    603 *   @brief
    604 *       Return TRUE if combined swizzle is enabled in this address library
    605 ***************************************************************************************************
    606 */
    607 BOOL_32 ADDR_API AddrUseCombinedSwizzle(ADDR_HANDLE hLib)
    608 {
    609     BOOL_32 useCombinedSwizzle = FALSE;
    610 
    611     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    612 
    613     ADDR_ASSERT(pLib != NULL);
    614 
    615     if (pLib)
    616     {
    617         useCombinedSwizzle = pLib->UseCombinedSwizzle();
    618     }
    619 
    620     return useCombinedSwizzle;
    621 }
    622 
    623 /**
    624 ***************************************************************************************************
    625 *   AddrExtractBankPipeSwizzle
    626 *
    627 *   @brief
    628 *       Extract Bank and Pipe swizzle from base256b
    629 *   @return
    630 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    631 ***************************************************************************************************
    632 */
    633 ADDR_E_RETURNCODE ADDR_API AddrExtractBankPipeSwizzle(
    634     ADDR_HANDLE                                 hLib,     ///< [in] addrlib handle
    635     const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT*  pIn,      ///< [in] input structure
    636     ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT*       pOut)     ///< [out] output structure
    637 {
    638     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    639 
    640     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    641 
    642     if (pLib != NULL)
    643     {
    644         returnCode = pLib->ExtractBankPipeSwizzle(pIn, pOut);
    645     }
    646     else
    647     {
    648         returnCode = ADDR_ERROR;
    649     }
    650 
    651     return returnCode;
    652 }
    653 
    654 /**
    655 ***************************************************************************************************
    656 *   AddrCombineBankPipeSwizzle
    657 *
    658 *   @brief
    659 *       Combine Bank and Pipe swizzle
    660 *   @return
    661 *       ADDR_E_RETURNCODE
    662 ***************************************************************************************************
    663 */
    664 ADDR_E_RETURNCODE ADDR_API AddrCombineBankPipeSwizzle(
    665     ADDR_HANDLE                                 hLib,
    666     const ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT*  pIn,
    667     ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT*       pOut)
    668 {
    669     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    670 
    671     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    672 
    673     if (pLib != NULL)
    674     {
    675         returnCode = pLib->CombineBankPipeSwizzle(pIn, pOut);
    676     }
    677     else
    678     {
    679         returnCode = ADDR_ERROR;
    680     }
    681 
    682     return returnCode;
    683 }
    684 
    685 /**
    686 ***************************************************************************************************
    687 *   AddrComputeSliceSwizzle
    688 *
    689 *   @brief
    690 *       Compute a swizzle for slice from a base swizzle
    691 *   @return
    692 *       ADDR_OK if no error
    693 ***************************************************************************************************
    694 */
    695 ADDR_E_RETURNCODE ADDR_API AddrComputeSliceSwizzle(
    696     ADDR_HANDLE                                 hLib,
    697     const ADDR_COMPUTE_SLICESWIZZLE_INPUT*      pIn,
    698     ADDR_COMPUTE_SLICESWIZZLE_OUTPUT*           pOut)
    699 {
    700     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    701 
    702     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    703 
    704     if (pLib != NULL)
    705     {
    706         returnCode = pLib->ComputeSliceTileSwizzle(pIn, pOut);
    707     }
    708     else
    709     {
    710         returnCode = ADDR_ERROR;
    711     }
    712 
    713     return returnCode;
    714 }
    715 
    716 /**
    717 ***************************************************************************************************
    718 *   AddrComputeBaseSwizzle
    719 *
    720 *   @brief
    721 *       Return a Combined Bank and Pipe swizzle base on surface based on surface type/index
    722 *   @return
    723 *       ADDR_OK if no error
    724 ***************************************************************************************************
    725 */
    726 ADDR_E_RETURNCODE ADDR_API AddrComputeBaseSwizzle(
    727     ADDR_HANDLE                             hLib,
    728     const ADDR_COMPUTE_BASE_SWIZZLE_INPUT*  pIn,
    729     ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT*       pOut)
    730 {
    731     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    732 
    733     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    734 
    735     if (pLib != NULL)
    736     {
    737         returnCode = pLib->ComputeBaseSwizzle(pIn, pOut);
    738     }
    739     else
    740     {
    741         returnCode = ADDR_ERROR;
    742     }
    743 
    744     return returnCode;
    745 }
    746 
    747 /**
    748 ***************************************************************************************************
    749 *   ElemFlt32ToDepthPixel
    750 *
    751 *   @brief
    752 *       Convert a FLT_32 value to a depth/stencil pixel value
    753 *
    754 *   @return
    755 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    756 *
    757 ***************************************************************************************************
    758 */
    759 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToDepthPixel(
    760     ADDR_HANDLE                         hLib,    ///< [in] addrlib handle
    761     const ELEM_FLT32TODEPTHPIXEL_INPUT* pIn,     ///< [in] per-component value
    762     ELEM_FLT32TODEPTHPIXEL_OUTPUT*      pOut)    ///< [out] final pixel value
    763 {
    764     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    765 
    766     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    767 
    768     if (pLib != NULL)
    769     {
    770         pLib->Flt32ToDepthPixel(pIn, pOut);
    771     }
    772     else
    773     {
    774         returnCode = ADDR_ERROR;
    775     }
    776 
    777     return returnCode;
    778 }
    779 
    780 /**
    781 ***************************************************************************************************
    782 *   ElemFlt32ToColorPixel
    783 *
    784 *   @brief
    785 *       Convert a FLT_32 value to a red/green/blue/alpha pixel value
    786 *
    787 *   @return
    788 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    789 *
    790 ***************************************************************************************************
    791 */
    792 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToColorPixel(
    793     ADDR_HANDLE                         hLib,    ///< [in] addrlib handle
    794     const ELEM_FLT32TOCOLORPIXEL_INPUT* pIn,     ///< [in] format, surface number and swap value
    795     ELEM_FLT32TOCOLORPIXEL_OUTPUT*      pOut)    ///< [out] final pixel value
    796 {
    797     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    798 
    799     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    800 
    801     if (pLib != NULL)
    802     {
    803         pLib->Flt32ToColorPixel(pIn, pOut);
    804     }
    805     else
    806     {
    807         returnCode = ADDR_ERROR;
    808     }
    809 
    810     return returnCode;
    811 }
    812 
    813 /**
    814 ***************************************************************************************************
    815 *   ElemGetExportNorm
    816 *
    817 *   @brief
    818 *       Helper function to check one format can be EXPORT_NUM,
    819 *       which is a register CB_COLOR_INFO.SURFACE_FORMAT.
    820 *       FP16 can be reported as EXPORT_NORM for rv770 in r600
    821 *       family
    822 *
    823 ***************************************************************************************************
    824 */
    825 BOOL_32 ADDR_API ElemGetExportNorm(
    826     ADDR_HANDLE                     hLib, ///< [in] addrlib handle
    827     const ELEM_GETEXPORTNORM_INPUT* pIn)  ///< [in] input structure
    828 {
    829     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    830     BOOL_32 enabled = FALSE;
    831 
    832     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    833 
    834     if (pLib != NULL)
    835     {
    836         enabled = pLib->GetExportNorm(pIn);
    837     }
    838     else
    839     {
    840         returnCode = ADDR_ERROR;
    841     }
    842 
    843     ADDR_ASSERT(returnCode == ADDR_OK);
    844 
    845     return enabled;
    846 }
    847 
    848 /**
    849 ***************************************************************************************************
    850 *   AddrConvertTileInfoToHW
    851 *
    852 *   @brief
    853 *       Convert tile info from real value to hardware register value
    854 *
    855 *   @return
    856 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    857 ***************************************************************************************************
    858 */
    859 ADDR_E_RETURNCODE ADDR_API AddrConvertTileInfoToHW(
    860     ADDR_HANDLE                             hLib, ///< [in] address lib handle
    861     const ADDR_CONVERT_TILEINFOTOHW_INPUT*  pIn,  ///< [in] tile info with real value
    862     ADDR_CONVERT_TILEINFOTOHW_OUTPUT*       pOut) ///< [out] tile info with HW register value
    863 {
    864     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    865 
    866     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    867 
    868     if (pLib != NULL)
    869     {
    870         returnCode = pLib->ConvertTileInfoToHW(pIn, pOut);
    871     }
    872     else
    873     {
    874         returnCode = ADDR_ERROR;
    875     }
    876 
    877     return returnCode;
    878 }
    879 
    880 /**
    881 ***************************************************************************************************
    882 *   AddrConvertTileIndex
    883 *
    884 *   @brief
    885 *       Convert tile index to tile mode/type/info
    886 *
    887 *   @return
    888 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    889 ***************************************************************************************************
    890 */
    891 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex(
    892     ADDR_HANDLE                          hLib, ///< [in] address lib handle
    893     const ADDR_CONVERT_TILEINDEX_INPUT*  pIn,  ///< [in] input - tile index
    894     ADDR_CONVERT_TILEINDEX_OUTPUT*       pOut) ///< [out] tile mode/type/info
    895 {
    896     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    897 
    898     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    899 
    900     if (pLib != NULL)
    901     {
    902         returnCode = pLib->ConvertTileIndex(pIn, pOut);
    903     }
    904     else
    905     {
    906         returnCode = ADDR_ERROR;
    907     }
    908 
    909     return returnCode;
    910 }
    911 
    912 /**
    913 ***************************************************************************************************
    914 *   AddrConvertTileIndex1
    915 *
    916 *   @brief
    917 *       Convert tile index to tile mode/type/info
    918 *
    919 *   @return
    920 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    921 ***************************************************************************************************
    922 */
    923 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex1(
    924     ADDR_HANDLE                          hLib, ///< [in] address lib handle
    925     const ADDR_CONVERT_TILEINDEX1_INPUT* pIn,  ///< [in] input - tile index
    926     ADDR_CONVERT_TILEINDEX_OUTPUT*       pOut) ///< [out] tile mode/type/info
    927 {
    928     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    929 
    930     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    931 
    932     if (pLib != NULL)
    933     {
    934         returnCode = pLib->ConvertTileIndex1(pIn, pOut);
    935     }
    936     else
    937     {
    938         returnCode = ADDR_ERROR;
    939     }
    940 
    941     return returnCode;
    942 }
    943 
    944 /**
    945 ***************************************************************************************************
    946 *   AddrGetTileIndex
    947 *
    948 *   @brief
    949 *       Get tile index from tile mode/type/info
    950 *
    951 *   @return
    952 *       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
    953 *
    954 *   @note
    955 *       Only meaningful for SI (and above)
    956 ***************************************************************************************************
    957 */
    958 ADDR_E_RETURNCODE ADDR_API AddrGetTileIndex(
    959     ADDR_HANDLE                     hLib,
    960     const ADDR_GET_TILEINDEX_INPUT* pIn,
    961     ADDR_GET_TILEINDEX_OUTPUT*      pOut)
    962 {
    963     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    964 
    965     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    966 
    967     if (pLib != NULL)
    968     {
    969         returnCode = pLib->GetTileIndex(pIn, pOut);
    970     }
    971     else
    972     {
    973         returnCode = ADDR_ERROR;
    974     }
    975 
    976     return returnCode;
    977 }
    978 
    979 /**
    980 ***************************************************************************************************
    981 *   AddrComputePrtInfo
    982 *
    983 *   @brief
    984 *       Interface function for ComputePrtInfo
    985 *
    986 ***************************************************************************************************
    987 */
    988 ADDR_E_RETURNCODE ADDR_API AddrComputePrtInfo(
    989     ADDR_HANDLE                 hLib,
    990     const ADDR_PRT_INFO_INPUT*  pIn,
    991     ADDR_PRT_INFO_OUTPUT*       pOut)
    992 {
    993     ADDR_E_RETURNCODE returnCode = ADDR_OK;
    994 
    995     AddrLib* pLib = AddrLib::GetAddrLib(hLib);
    996 
    997     if (pLib != NULL)
    998     {
    999         returnCode = pLib->ComputePrtInfo(pIn, pOut);
   1000     }
   1001     else
   1002     {
   1003         returnCode = ADDR_ERROR;
   1004     }
   1005 
   1006     return returnCode;
   1007 }
   1008 
   1009