2 * Copyright © 2014 Advanced Micro Devices, Inc.
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:
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.
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
28 ***************************************************************************************************
30 * @brief Contains the implementation for the AddrLib base class..
31 ***************************************************************************************************
34 #include "addrinterface.h"
36 #include "addrcommon.h"
38 #if defined(__APPLE__)
40 UINT_32
div64_32(UINT_64 n
, UINT_32 base
)
45 UINT_32 high
= rem
>> 32;
51 res
= (UINT_64
) high
<< 32;
52 rem
-= (UINT_64
) (high
* base
) << 32;
55 while (((INT_64
)b
> 0) && (b
< rem
))
77 UINT_32
__umoddi3(UINT_64 n
, UINT_32 base
)
79 return div64_32(n
, base
);
85 ///////////////////////////////////////////////////////////////////////////////////////////////////
86 // Constructor/Destructor
87 ///////////////////////////////////////////////////////////////////////////////////////////////////
90 ***************************************************************************************************
94 * Constructor for the AddrLib class
96 ***************************************************************************************************
99 m_class(BASE_ADDRLIB
),
100 m_chipFamily(ADDR_CHIP_FAMILY_IVLD
),
102 m_version(ADDRLIB_VERSION
),
105 m_pipeInterleaveBytes(0),
107 m_minPitchAlignPixels(1),
111 m_configFlags
.value
= 0;
115 ***************************************************************************************************
119 * Constructor for the AddrLib class with hClient as parameter
121 ***************************************************************************************************
123 AddrLib::AddrLib(const AddrClient
* pClient
) :
125 m_class(BASE_ADDRLIB
),
126 m_chipFamily(ADDR_CHIP_FAMILY_IVLD
),
128 m_version(ADDRLIB_VERSION
),
131 m_pipeInterleaveBytes(0),
133 m_minPitchAlignPixels(1),
137 m_configFlags
.value
= 0;
141 ***************************************************************************************************
145 * Destructor for the AddrLib class
147 ***************************************************************************************************
159 ///////////////////////////////////////////////////////////////////////////////////////////////////
160 // Initialization/Helper
161 ///////////////////////////////////////////////////////////////////////////////////////////////////
164 ***************************************************************************************************
168 * Creates and initializes AddrLib object.
172 ***************************************************************************************************
174 ADDR_E_RETURNCODE
AddrLib::Create(
175 const ADDR_CREATE_INPUT
* pCreateIn
, ///< [in] pointer to ADDR_CREATE_INPUT
176 ADDR_CREATE_OUTPUT
* pCreateOut
) ///< [out] pointer to ADDR_CREATE_OUTPUT
178 AddrLib
* pLib
= NULL
;
179 ADDR_E_RETURNCODE returnCode
= ADDR_OK
;
181 if (pCreateIn
->createFlags
.fillSizeFields
== TRUE
)
183 if ((pCreateIn
->size
!= sizeof(ADDR_CREATE_INPUT
)) ||
184 (pCreateOut
->size
!= sizeof(ADDR_CREATE_OUTPUT
)))
186 returnCode
= ADDR_PARAMSIZEMISMATCH
;
190 if ((returnCode
== ADDR_OK
) &&
191 (pCreateIn
->callbacks
.allocSysMem
!= NULL
) &&
192 (pCreateIn
->callbacks
.freeSysMem
!= NULL
))
194 AddrClient client
= {
199 switch (pCreateIn
->chipEngine
)
201 case CIASICIDGFXENGINE_SOUTHERNISLAND
:
202 switch (pCreateIn
->chipFamily
)
205 pLib
= AddrSIHwlInit(&client
);
208 case FAMILY_CZ
: // VI based fusion(carrizo)
210 case FAMILY_KV
: // CI based fusion
211 pLib
= AddrCIHwlInit(&client
);
214 ADDR_ASSERT_ALWAYS();
219 ADDR_ASSERT_ALWAYS();
228 // Pass createFlags to configFlags first since these flags may be overwritten
229 pLib
->m_configFlags
.noCubeMipSlicesPad
= pCreateIn
->createFlags
.noCubeMipSlicesPad
;
230 pLib
->m_configFlags
.fillSizeFields
= pCreateIn
->createFlags
.fillSizeFields
;
231 pLib
->m_configFlags
.useTileIndex
= pCreateIn
->createFlags
.useTileIndex
;
232 pLib
->m_configFlags
.useCombinedSwizzle
= pCreateIn
->createFlags
.useCombinedSwizzle
;
233 pLib
->m_configFlags
.checkLast2DLevel
= pCreateIn
->createFlags
.checkLast2DLevel
;
234 pLib
->m_configFlags
.useHtileSliceAlign
= pCreateIn
->createFlags
.useHtileSliceAlign
;
235 pLib
->m_configFlags
.allowLargeThickTile
= pCreateIn
->createFlags
.allowLargeThickTile
;
236 pLib
->m_configFlags
.disableLinearOpt
= FALSE
;
238 pLib
->SetAddrChipFamily(pCreateIn
->chipFamily
, pCreateIn
->chipRevision
);
240 pLib
->SetMinPitchAlignPixels(pCreateIn
->minPitchAlignPixels
);
242 // Global parameters initialized and remaining configFlags bits are set as well
243 initValid
= pLib
->HwlInitGlobalParams(pCreateIn
);
247 pLib
->m_pElemLib
= AddrElemLib::Create(pLib
);
251 pLib
->m_pElemLib
= NULL
; // Don't go on allocating element lib
252 returnCode
= ADDR_INVALIDGBREGVALUES
;
255 if (pLib
->m_pElemLib
== NULL
)
259 ADDR_ASSERT_ALWAYS();
263 pLib
->m_pElemLib
->SetConfigFlags(pLib
->m_configFlags
);
267 pCreateOut
->hLib
= pLib
;
269 if ((pLib
!= NULL
) &&
270 (returnCode
== ADDR_OK
))
272 pCreateOut
->numEquations
=
273 pLib
->HwlGetEquationTableInfo(&pCreateOut
->pEquationTable
);
276 if ((pLib
== NULL
) &&
277 (returnCode
== ADDR_OK
))
279 // Unknown failures, we return the general error code
280 returnCode
= ADDR_ERROR
;
287 ***************************************************************************************************
288 * AddrLib::SetAddrChipFamily
291 * Convert familyID defined in atiid.h to AddrChipFamily and set m_chipFamily/m_chipRevision
294 ***************************************************************************************************
296 VOID
AddrLib::SetAddrChipFamily(
297 UINT_32 uChipFamily
, ///< [in] chip family defined in atiih.h
298 UINT_32 uChipRevision
) ///< [in] chip revision defined in "asic_family"_id.h
300 AddrChipFamily family
= HwlConvertChipFamily(uChipFamily
, uChipRevision
);
302 ADDR_ASSERT(family
!= ADDR_CHIP_FAMILY_IVLD
);
304 m_chipFamily
= family
;
305 m_chipRevision
= uChipRevision
;
309 ***************************************************************************************************
310 * AddrLib::SetMinPitchAlignPixels
313 * Set m_minPitchAlignPixels with input param
317 ***************************************************************************************************
319 VOID
AddrLib::SetMinPitchAlignPixels(
320 UINT_32 minPitchAlignPixels
) ///< [in] minmum pitch alignment in pixels
322 m_minPitchAlignPixels
= (minPitchAlignPixels
== 0) ? 1 : minPitchAlignPixels
;
326 ***************************************************************************************************
327 * AddrLib::GetAddrLib
330 * Get AddrLib pointer
333 * An AddrLib class pointer
334 ***************************************************************************************************
336 AddrLib
* AddrLib::GetAddrLib(
337 ADDR_HANDLE hLib
) ///< [in] handle of ADDR_HANDLE
339 return static_cast<AddrLib
*>(hLib
);
343 ***************************************************************************************************
344 * AddrLib::GetMaxAlignments
347 * Gets maximum alignments
351 ***************************************************************************************************
353 ADDR_E_RETURNCODE
AddrLib::GetMaxAlignments(
354 ADDR_GET_MAX_ALINGMENTS_OUTPUT
* pOut
///< [out] output structure
357 ADDR_E_RETURNCODE returnCode
= ADDR_OK
;
359 if (GetFillSizeFieldsFlags() == TRUE
)
361 if (pOut
->size
!= sizeof(ADDR_GET_MAX_ALINGMENTS_OUTPUT
))
363 returnCode
= ADDR_PARAMSIZEMISMATCH
;
367 if (returnCode
== ADDR_OK
)
369 returnCode
= HwlGetMaxAlignments(pOut
);
376 ***************************************************************************************************
377 * AddrLib::Bits2Number
380 * Cat a array of binary bit to a number
383 * The number combined with the array of bits
384 ***************************************************************************************************
386 UINT_32
AddrLib::Bits2Number(
387 UINT_32 bitNum
, ///< [in] how many bits
388 ...) ///< [in] varaible bits value starting from MSB
394 va_start(bits_ptr
, bitNum
);
396 for(i
= 0; i
< bitNum
; i
++)
398 number
|= va_arg(bits_ptr
, UINT_32
);
410 ///////////////////////////////////////////////////////////////////////////////////////////////////
412 ///////////////////////////////////////////////////////////////////////////////////////////////////
416 ***************************************************************************************************
417 * AddrLib::Flt32ToColorPixel
420 * Convert a FLT_32 value to a depth/stencil pixel value
423 ***************************************************************************************************
425 ADDR_E_RETURNCODE
AddrLib::Flt32ToDepthPixel(
426 const ELEM_FLT32TODEPTHPIXEL_INPUT
* pIn
,
427 ELEM_FLT32TODEPTHPIXEL_OUTPUT
* pOut
) const
429 ADDR_E_RETURNCODE returnCode
= ADDR_OK
;
431 if (GetFillSizeFieldsFlags() == TRUE
)
433 if ((pIn
->size
!= sizeof(ELEM_FLT32TODEPTHPIXEL_INPUT
)) ||
434 (pOut
->size
!= sizeof(ELEM_FLT32TODEPTHPIXEL_OUTPUT
)))
436 returnCode
= ADDR_PARAMSIZEMISMATCH
;
440 if (returnCode
== ADDR_OK
)
442 GetElemLib()->Flt32ToDepthPixel(pIn
->format
, pIn
->comps
, pOut
->pPixel
);
444 UINT_32 depthBase
= 0;
445 UINT_32 stencilBase
= 0;
446 UINT_32 depthBits
= 0;
447 UINT_32 stencilBits
= 0;
454 case ADDR_DEPTH_X8_24
:
455 case ADDR_DEPTH_8_24
:
456 case ADDR_DEPTH_X8_24_FLOAT
:
457 case ADDR_DEPTH_8_24_FLOAT
:
462 case ADDR_DEPTH_32_FLOAT
:
465 case ADDR_DEPTH_X24_8_32_FLOAT
:
474 // Overwrite base since R800 has no "tileBase"
475 if (GetElemLib()->IsDepthStencilTilePlanar() == FALSE
)
484 pOut
->stencilBase
= stencilBase
;
485 pOut
->depthBase
= depthBase
;
486 pOut
->depthBits
= depthBits
;
487 pOut
->stencilBits
= stencilBits
;
494 ***************************************************************************************************
495 * AddrLib::Flt32ToColorPixel
498 * Convert a FLT_32 value to a red/green/blue/alpha pixel value
501 ***************************************************************************************************
503 ADDR_E_RETURNCODE
AddrLib::Flt32ToColorPixel(
504 const ELEM_FLT32TOCOLORPIXEL_INPUT
* pIn
,
505 ELEM_FLT32TOCOLORPIXEL_OUTPUT
* pOut
) const
507 ADDR_E_RETURNCODE returnCode
= ADDR_OK
;
509 if (GetFillSizeFieldsFlags() == TRUE
)
511 if ((pIn
->size
!= sizeof(ELEM_FLT32TOCOLORPIXEL_INPUT
)) ||
512 (pOut
->size
!= sizeof(ELEM_FLT32TOCOLORPIXEL_OUTPUT
)))
514 returnCode
= ADDR_PARAMSIZEMISMATCH
;
518 if (returnCode
== ADDR_OK
)
520 GetElemLib()->Flt32ToColorPixel(pIn
->format
,
532 ***************************************************************************************************
533 * AddrLib::GetExportNorm
536 * Check one format can be EXPORT_NUM
538 * TRUE if EXPORT_NORM can be used
539 ***************************************************************************************************
541 BOOL_32
AddrLib::GetExportNorm(
542 const ELEM_GETEXPORTNORM_INPUT
* pIn
) const
544 ADDR_E_RETURNCODE returnCode
= ADDR_OK
;
546 BOOL_32 enabled
= FALSE
;
548 if (GetFillSizeFieldsFlags() == TRUE
)
550 if (pIn
->size
!= sizeof(ELEM_GETEXPORTNORM_INPUT
))
552 returnCode
= ADDR_PARAMSIZEMISMATCH
;
556 if (returnCode
== ADDR_OK
)
558 enabled
= GetElemLib()->PixGetExportNorm(pIn
->format
, pIn
->num
, pIn
->swap
);