amd/addrlib: update to latest version
[mesa.git] / src / amd / addrlib / addrinterface.h
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.h
30 * @brief Contains the addrlib interfaces declaration and parameter defines
31 ****************************************************************************************************
32 */
33 #ifndef __ADDR_INTERFACE_H__
34 #define __ADDR_INTERFACE_H__
35
36 #include "addrtypes.h"
37
38 #if defined(__cplusplus)
39 extern "C"
40 {
41 #endif
42
43 #define ADDRLIB_VERSION_MAJOR 6
44 #define ADDRLIB_VERSION_MINOR 2
45 #define ADDRLIB_VERSION ((ADDRLIB_VERSION_MAJOR << 16) | ADDRLIB_VERSION_MINOR)
46
47 /// Virtually all interface functions need ADDR_HANDLE as first parameter
48 typedef VOID* ADDR_HANDLE;
49
50 /// Client handle used in callbacks
51 typedef VOID* ADDR_CLIENT_HANDLE;
52
53 /**
54 * /////////////////////////////////////////////////////////////////////////////////////////////////
55 * // Callback functions
56 * /////////////////////////////////////////////////////////////////////////////////////////////////
57 * typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)(
58 * const ADDR_ALLOCSYSMEM_INPUT* pInput);
59 * typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)(
60 * VOID* pVirtAddr);
61 * typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)(
62 * const ADDR_DEBUGPRINT_INPUT* pInput);
63 *
64 * /////////////////////////////////////////////////////////////////////////////////////////////////
65 * // Create/Destroy/Config functions
66 * /////////////////////////////////////////////////////////////////////////////////////////////////
67 * AddrCreate()
68 * AddrDestroy()
69 *
70 * /////////////////////////////////////////////////////////////////////////////////////////////////
71 * // Surface functions
72 * /////////////////////////////////////////////////////////////////////////////////////////////////
73 * AddrComputeSurfaceInfo()
74 * AddrComputeSurfaceAddrFromCoord()
75 * AddrComputeSurfaceCoordFromAddr()
76 *
77 * /////////////////////////////////////////////////////////////////////////////////////////////////
78 * // HTile functions
79 * /////////////////////////////////////////////////////////////////////////////////////////////////
80 * AddrComputeHtileInfo()
81 * AddrComputeHtileAddrFromCoord()
82 * AddrComputeHtileCoordFromAddr()
83 *
84 * /////////////////////////////////////////////////////////////////////////////////////////////////
85 * // C-mask functions
86 * /////////////////////////////////////////////////////////////////////////////////////////////////
87 * AddrComputeCmaskInfo()
88 * AddrComputeCmaskAddrFromCoord()
89 * AddrComputeCmaskCoordFromAddr()
90 *
91 * /////////////////////////////////////////////////////////////////////////////////////////////////
92 * // F-mask functions
93 * /////////////////////////////////////////////////////////////////////////////////////////////////
94 * AddrComputeFmaskInfo()
95 * AddrComputeFmaskAddrFromCoord()
96 * AddrComputeFmaskCoordFromAddr()
97 *
98 * /////////////////////////////////////////////////////////////////////////////////////////////////
99 * // Element/Utility functions
100 * /////////////////////////////////////////////////////////////////////////////////////////////////
101 * ElemFlt32ToDepthPixel()
102 * ElemFlt32ToColorPixel()
103 * AddrExtractBankPipeSwizzle()
104 * AddrCombineBankPipeSwizzle()
105 * AddrComputeSliceSwizzle()
106 * AddrConvertTileInfoToHW()
107 * AddrConvertTileIndex()
108 * AddrConvertTileIndex1()
109 * AddrGetTileIndex()
110 * AddrComputeBaseSwizzle()
111 * AddrUseTileIndex()
112 * AddrUseCombinedSwizzle()
113 *
114 **/
115
116 ////////////////////////////////////////////////////////////////////////////////////////////////////
117 // Callback functions
118 ////////////////////////////////////////////////////////////////////////////////////////////////////
119
120 /**
121 ****************************************************************************************************
122 * @brief channel setting structure
123 ****************************************************************************************************
124 */
125 typedef union _ADDR_CHANNEL_SETTING
126 {
127 struct
128 {
129 UINT_8 valid : 1; ///< Indicate whehter this channel setting is valid
130 UINT_8 channel : 2; ///< 0 for x channel, 1 for y channel, 2 for z channel
131 UINT_8 index : 5; ///< Channel index
132 };
133 UINT_8 value; ///< Value
134 } ADDR_CHANNEL_SETTING;
135
136 /**
137 ****************************************************************************************************
138 * @brief address equation key structure
139 ****************************************************************************************************
140 */
141 typedef union _ADDR_EQUATION_KEY
142 {
143 struct
144 {
145 UINT_32 log2ElementBytes : 3; ///< Log2 of Bytes per pixel
146 UINT_32 tileMode : 5; ///< Tile mode
147 UINT_32 microTileType : 3; ///< Micro tile type
148 UINT_32 pipeConfig : 5; ///< pipe config
149 UINT_32 numBanksLog2 : 3; ///< Number of banks log2
150 UINT_32 bankWidth : 4; ///< Bank width
151 UINT_32 bankHeight : 4; ///< Bank height
152 UINT_32 macroAspectRatio : 3; ///< Macro tile aspect ratio
153 UINT_32 prt : 1; ///< SI only, indicate whether this equation is for prt
154 UINT_32 reserved : 1; ///< Reserved bit
155 } fields;
156 UINT_32 value;
157 } ADDR_EQUATION_KEY;
158
159 /**
160 ****************************************************************************************************
161 * @brief address equation structure
162 ****************************************************************************************************
163 */
164 #define ADDR_MAX_EQUATION_BIT 20u
165
166 // Invalid equation index
167 #define ADDR_INVALID_EQUATION_INDEX 0xFFFFFFFF
168
169 typedef struct _ADDR_EQUATION
170 {
171 ADDR_CHANNEL_SETTING addr[ADDR_MAX_EQUATION_BIT]; ///< addr setting
172 ///< each bit is result of addr ^ xor ^ xor2
173 ADDR_CHANNEL_SETTING xor1[ADDR_MAX_EQUATION_BIT]; ///< xor setting
174 ADDR_CHANNEL_SETTING xor2[ADDR_MAX_EQUATION_BIT]; ///< xor2 setting
175 UINT_32 numBits; ///< The number of bits in equation
176 BOOL_32 stackedDepthSlices; ///< TRUE if depth slices are treated as being
177 ///< stacked vertically prior to swizzling
178 } ADDR_EQUATION;
179
180
181 /**
182 ****************************************************************************************************
183 * @brief Alloc system memory flags.
184 * @note These flags are reserved for future use and if flags are added will minimize the impact
185 * of the client.
186 ****************************************************************************************************
187 */
188 typedef union _ADDR_ALLOCSYSMEM_FLAGS
189 {
190 struct
191 {
192 UINT_32 reserved : 32; ///< Reserved for future use.
193 } fields;
194 UINT_32 value;
195
196 } ADDR_ALLOCSYSMEM_FLAGS;
197
198 /**
199 ****************************************************************************************************
200 * @brief Alloc system memory input structure
201 ****************************************************************************************************
202 */
203 typedef struct _ADDR_ALLOCSYSMEM_INPUT
204 {
205 UINT_32 size; ///< Size of this structure in bytes
206
207 ADDR_ALLOCSYSMEM_FLAGS flags; ///< System memory flags.
208 UINT_32 sizeInBytes; ///< System memory allocation size in bytes.
209 ADDR_CLIENT_HANDLE hClient; ///< Client handle
210 } ADDR_ALLOCSYSMEM_INPUT;
211
212 /**
213 ****************************************************************************************************
214 * ADDR_ALLOCSYSMEM
215 * @brief
216 * Allocate system memory callback function. Returns valid pointer on success.
217 ****************************************************************************************************
218 */
219 typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)(
220 const ADDR_ALLOCSYSMEM_INPUT* pInput);
221
222 /**
223 ****************************************************************************************************
224 * @brief Free system memory input structure
225 ****************************************************************************************************
226 */
227 typedef struct _ADDR_FREESYSMEM_INPUT
228 {
229 UINT_32 size; ///< Size of this structure in bytes
230
231 VOID* pVirtAddr; ///< Virtual address
232 ADDR_CLIENT_HANDLE hClient; ///< Client handle
233 } ADDR_FREESYSMEM_INPUT;
234
235 /**
236 ****************************************************************************************************
237 * ADDR_FREESYSMEM
238 * @brief
239 * Free system memory callback function.
240 * Returns ADDR_OK on success.
241 ****************************************************************************************************
242 */
243 typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)(
244 const ADDR_FREESYSMEM_INPUT* pInput);
245
246 /**
247 ****************************************************************************************************
248 * @brief Print debug message input structure
249 ****************************************************************************************************
250 */
251 typedef struct _ADDR_DEBUGPRINT_INPUT
252 {
253 UINT_32 size; ///< Size of this structure in bytes
254
255 CHAR* pDebugString; ///< Debug print string
256 va_list ap; ///< Variable argument list
257 ADDR_CLIENT_HANDLE hClient; ///< Client handle
258 } ADDR_DEBUGPRINT_INPUT;
259
260 /**
261 ****************************************************************************************************
262 * ADDR_DEBUGPRINT
263 * @brief
264 * Print debug message callback function.
265 * Returns ADDR_OK on success.
266 ****************************************************************************************************
267 */
268 typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)(
269 const ADDR_DEBUGPRINT_INPUT* pInput);
270
271 /**
272 ****************************************************************************************************
273 * ADDR_CALLBACKS
274 *
275 * @brief
276 * Address Library needs client to provide system memory alloc/free routines.
277 ****************************************************************************************************
278 */
279 typedef struct _ADDR_CALLBACKS
280 {
281 ADDR_ALLOCSYSMEM allocSysMem; ///< Routine to allocate system memory
282 ADDR_FREESYSMEM freeSysMem; ///< Routine to free system memory
283 ADDR_DEBUGPRINT debugPrint; ///< Routine to print debug message
284 } ADDR_CALLBACKS;
285
286 ////////////////////////////////////////////////////////////////////////////////////////////////////
287 // Create/Destroy functions
288 ////////////////////////////////////////////////////////////////////////////////////////////////////
289
290 /**
291 ****************************************************************************************************
292 * ADDR_CREATE_FLAGS
293 *
294 * @brief
295 * This structure is used to pass some setup in creation of AddrLib
296 * @note
297 ****************************************************************************************************
298 */
299 typedef union _ADDR_CREATE_FLAGS
300 {
301 struct
302 {
303 UINT_32 noCubeMipSlicesPad : 1; ///< Turn cubemap faces padding off
304 UINT_32 fillSizeFields : 1; ///< If clients fill size fields in all input and
305 /// output structure
306 UINT_32 useTileIndex : 1; ///< Make tileIndex field in input valid
307 UINT_32 useCombinedSwizzle : 1; ///< Use combined tile swizzle
308 UINT_32 checkLast2DLevel : 1; ///< Check the last 2D mip sub level
309 UINT_32 useHtileSliceAlign : 1; ///< Do htile single slice alignment
310 UINT_32 allowLargeThickTile : 1; ///< Allow 64*thickness*bytesPerPixel > rowSize
311 UINT_32 reserved : 25; ///< Reserved bits for future use
312 };
313
314 UINT_32 value;
315 } ADDR_CREATE_FLAGS;
316
317 /**
318 ****************************************************************************************************
319 * ADDR_REGISTER_VALUE
320 *
321 * @brief
322 * Data from registers to setup AddrLib global data, used in AddrCreate
323 ****************************************************************************************************
324 */
325 typedef struct _ADDR_REGISTER_VALUE
326 {
327 UINT_32 gbAddrConfig; ///< For R8xx, use GB_ADDR_CONFIG register value.
328 /// For R6xx/R7xx, use GB_TILING_CONFIG.
329 /// But they can be treated as the same.
330 /// if this value is 0, use chip to set default value
331 UINT_32 backendDisables; ///< 1 bit per backend, starting with LSB. 1=disabled,0=enabled.
332 /// Register value of CC_RB_BACKEND_DISABLE.BACKEND_DISABLE
333
334 /// R800 registers-----------------------------------------------
335 UINT_32 noOfBanks; ///< Number of h/w ram banks - For r800: MC_ARB_RAMCFG.NOOFBANK
336 /// No enums for this value in h/w header files
337 /// 0: 4
338 /// 1: 8
339 /// 2: 16
340 UINT_32 noOfRanks; /// MC_ARB_RAMCFG.NOOFRANK
341 /// 0: 1
342 /// 1: 2
343 /// SI (R1000) registers-----------------------------------------
344 const UINT_32* pTileConfig; ///< Global tile setting tables
345 UINT_32 noOfEntries; ///< Number of entries in pTileConfig
346
347 ///< CI registers-------------------------------------------------
348 const UINT_32* pMacroTileConfig; ///< Global macro tile mode table
349 UINT_32 noOfMacroEntries; ///< Number of entries in pMacroTileConfig
350
351 ///< GFX9 HW parameters
352 UINT_32 blockVarSizeLog2; ///< SW_VAR_* block size
353 } ADDR_REGISTER_VALUE;
354
355 /**
356 ****************************************************************************************************
357 * ADDR_CREATE_INPUT
358 *
359 * @brief
360 * Parameters use to create an AddrLib Object. Caller must provide all fields.
361 *
362 ****************************************************************************************************
363 */
364 typedef struct _ADDR_CREATE_INPUT
365 {
366 UINT_32 size; ///< Size of this structure in bytes
367
368 UINT_32 chipEngine; ///< Chip Engine
369 UINT_32 chipFamily; ///< Chip Family
370 UINT_32 chipRevision; ///< Chip Revision
371 ADDR_CALLBACKS callbacks; ///< Callbacks for sysmem alloc/free/print
372 ADDR_CREATE_FLAGS createFlags; ///< Flags to setup AddrLib
373 ADDR_REGISTER_VALUE regValue; ///< Data from registers to setup AddrLib global data
374 ADDR_CLIENT_HANDLE hClient; ///< Client handle
375 UINT_32 minPitchAlignPixels; ///< Minimum pitch alignment in pixels
376 } ADDR_CREATE_INPUT;
377
378 /**
379 ****************************************************************************************************
380 * ADDR_CREATEINFO_OUTPUT
381 *
382 * @brief
383 * Return AddrLib handle to client driver
384 *
385 ****************************************************************************************************
386 */
387 typedef struct _ADDR_CREATE_OUTPUT
388 {
389 UINT_32 size; ///< Size of this structure in bytes
390
391 ADDR_HANDLE hLib; ///< Address lib handle
392
393 UINT_32 numEquations; ///< Number of equations in the table
394 const ADDR_EQUATION* pEquationTable; ///< Pointer to the equation table
395 } ADDR_CREATE_OUTPUT;
396
397 /**
398 ****************************************************************************************************
399 * AddrCreate
400 *
401 * @brief
402 * Create AddrLib object, must be called before any interface calls
403 *
404 * @return
405 * ADDR_OK if successful
406 ****************************************************************************************************
407 */
408 ADDR_E_RETURNCODE ADDR_API AddrCreate(
409 const ADDR_CREATE_INPUT* pAddrCreateIn,
410 ADDR_CREATE_OUTPUT* pAddrCreateOut);
411
412
413
414 /**
415 ****************************************************************************************************
416 * AddrDestroy
417 *
418 * @brief
419 * Destroy AddrLib object, must be called to free internally allocated resources.
420 *
421 * @return
422 * ADDR_OK if successful
423 ****************************************************************************************************
424 */
425 ADDR_E_RETURNCODE ADDR_API AddrDestroy(
426 ADDR_HANDLE hLib);
427
428
429
430 ////////////////////////////////////////////////////////////////////////////////////////////////////
431 // Surface functions
432 ////////////////////////////////////////////////////////////////////////////////////////////////////
433
434 /**
435 ****************************************************************************************************
436 * @brief
437 * Bank/tiling parameters. On function input, these can be set as desired or
438 * left 0 for AddrLib to calculate/default. On function output, these are the actual
439 * parameters used.
440 * @note
441 * Valid bankWidth/bankHeight value:
442 * 1,2,4,8. They are factors instead of pixels or bytes.
443 *
444 * The bank number remains constant across each row of the
445 * macro tile as each pipe is selected, so the number of
446 * tiles in the x direction with the same bank number will
447 * be bank_width * num_pipes.
448 ****************************************************************************************************
449 */
450 typedef struct _ADDR_TILEINFO
451 {
452 /// Any of these parameters can be set to 0 to use the HW default.
453 UINT_32 banks; ///< Number of banks, numerical value
454 UINT_32 bankWidth; ///< Number of tiles in the X direction in the same bank
455 UINT_32 bankHeight; ///< Number of tiles in the Y direction in the same bank
456 UINT_32 macroAspectRatio; ///< Macro tile aspect ratio. 1-1:1, 2-4:1, 4-16:1, 8-64:1
457 UINT_32 tileSplitBytes; ///< Tile split size, in bytes
458 AddrPipeCfg pipeConfig; ///< Pipe Config = HW enum + 1
459 } ADDR_TILEINFO;
460
461 // Create a define to avoid client change. The removal of R800 is because we plan to implement SI
462 // within 800 HWL - An AddrPipeCfg is added in above data structure
463 typedef ADDR_TILEINFO ADDR_R800_TILEINFO;
464
465 /**
466 ****************************************************************************************************
467 * @brief
468 * Information needed by quad buffer stereo support
469 ****************************************************************************************************
470 */
471 typedef struct _ADDR_QBSTEREOINFO
472 {
473 UINT_32 eyeHeight; ///< Height (in pixel rows) to right eye
474 UINT_32 rightOffset; ///< Offset (in bytes) to right eye
475 UINT_32 rightSwizzle; ///< TileSwizzle for right eyes
476 } ADDR_QBSTEREOINFO;
477
478 /**
479 ****************************************************************************************************
480 * ADDR_SURFACE_FLAGS
481 *
482 * @brief
483 * Surface flags
484 ****************************************************************************************************
485 */
486 typedef union _ADDR_SURFACE_FLAGS
487 {
488 struct
489 {
490 UINT_32 color : 1; ///< Flag indicates this is a color buffer
491 UINT_32 depth : 1; ///< Flag indicates this is a depth/stencil buffer
492 UINT_32 stencil : 1; ///< Flag indicates this is a stencil buffer
493 UINT_32 texture : 1; ///< Flag indicates this is a texture
494 UINT_32 cube : 1; ///< Flag indicates this is a cubemap
495 UINT_32 volume : 1; ///< Flag indicates this is a volume texture
496 UINT_32 fmask : 1; ///< Flag indicates this is an fmask
497 UINT_32 cubeAsArray : 1; ///< Flag indicates if treat cubemap as arrays
498 UINT_32 compressZ : 1; ///< Flag indicates z buffer is compressed
499 UINT_32 overlay : 1; ///< Flag indicates this is an overlay surface
500 UINT_32 noStencil : 1; ///< Flag indicates this depth has no separate stencil
501 UINT_32 display : 1; ///< Flag indicates this should match display controller req.
502 UINT_32 opt4Space : 1; ///< Flag indicates this surface should be optimized for space
503 /// i.e. save some memory but may lose performance
504 UINT_32 prt : 1; ///< Flag for partially resident texture
505 UINT_32 qbStereo : 1; ///< Quad buffer stereo surface
506 UINT_32 pow2Pad : 1; ///< SI: Pad to pow2, must set for mipmap (include level0)
507 UINT_32 interleaved : 1; ///< Special flag for interleaved YUV surface padding
508 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable
509 UINT_32 dispTileType : 1; ///< NI: force display Tiling for 128 bit shared resoruce
510 UINT_32 dccCompatible : 1; ///< VI: whether to make MSAA surface support dcc fast clear
511 UINT_32 dccPipeWorkaround : 1; ///< VI: whether to workaround the HW limit that
512 /// dcc can't be enabled if pipe config of tile mode
513 /// is different from that of ASIC, this flag
514 /// is address lib internal flag, client should ignore it
515 UINT_32 czDispCompatible : 1; ///< SI+: CZ family has a HW bug needs special alignment.
516 /// This flag indicates we need to follow the
517 /// alignment with CZ families or other ASICs under
518 /// PX configuration + CZ.
519 UINT_32 nonSplit : 1; ///< CI: depth texture should not be split
520 UINT_32 disableLinearOpt : 1; ///< Disable tile mode optimization to linear
521 UINT_32 needEquation : 1; ///< Make the surface tile setting equation compatible.
522 /// This flag indicates we need to override tile
523 /// mode to PRT_* tile mode to disable slice rotation,
524 /// which is needed by swizzle pattern equation.
525 UINT_32 skipIndicesOutput : 1; ///< Skipping indices in output.
526 UINT_32 rotateDisplay : 1; ///< Rotate micro tile type
527 UINT_32 minimizeAlignment : 1; ///< Minimize alignment
528 UINT_32 preferEquation : 1; ///< Return equation index without adjusting tile mode
529 UINT_32 matchStencilTileCfg : 1; ///< Select tile index of stencil as well as depth surface
530 /// to make sure they share same tile config parameters
531 UINT_32 reserved : 2; ///< Reserved bits
532 };
533
534 UINT_32 value;
535 } ADDR_SURFACE_FLAGS;
536
537 /**
538 ****************************************************************************************************
539 * ADDR_COMPUTE_SURFACE_INFO_INPUT
540 *
541 * @brief
542 * Input structure for AddrComputeSurfaceInfo
543 ****************************************************************************************************
544 */
545 typedef struct _ADDR_COMPUTE_SURFACE_INFO_INPUT
546 {
547 UINT_32 size; ///< Size of this structure in bytes
548
549 AddrTileMode tileMode; ///< Tile mode
550 AddrFormat format; ///< If format is set to valid one, bpp/width/height
551 /// might be overwritten
552 UINT_32 bpp; ///< Bits per pixel
553 UINT_32 numSamples; ///< Number of samples
554 UINT_32 width; ///< Width, in pixels
555 UINT_32 height; ///< Height, in pixels
556 UINT_32 numSlices; ///< Number of surface slices or depth
557 UINT_32 slice; ///< Slice index
558 UINT_32 mipLevel; ///< Current mipmap level
559 UINT_32 numMipLevels; ///< Number of mips in mip chain
560 ADDR_SURFACE_FLAGS flags; ///< Surface type flags
561 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
562 /// number of samples for normal AA; Set it to the
563 /// number of fragments for EQAA
564 /// r800 and later HWL parameters
565 // Needed by 2D tiling, for linear and 1D tiling, just keep them 0's
566 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Set to 0 to default/calculate
567 AddrTileType tileType; ///< Micro tiling type, not needed when tileIndex != -1
568 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
569 /// while the global useTileIndex is set to 1
570 UINT_32 basePitch; ///< Base level pitch in pixels, 0 means ignored, is a
571 /// must for mip levels from SI+.
572 /// Don't use pitch in blocks for compressed formats!
573 UINT_32 maxBaseAlign; ///< Max base alignment request from client
574 UINT_32 pitchAlign; ///< Pitch alignment request from client
575 UINT_32 heightAlign; ///< Height alignment request from client
576 } ADDR_COMPUTE_SURFACE_INFO_INPUT;
577
578 /**
579 ****************************************************************************************************
580 * ADDR_COMPUTE_SURFACE_INFO_OUTPUT
581 *
582 * @brief
583 * Output structure for AddrComputeSurfInfo
584 * @note
585 Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
586 Pixel: Original pixel
587 ****************************************************************************************************
588 */
589 typedef struct _ADDR_COMPUTE_SURFACE_INFO_OUTPUT
590 {
591 UINT_32 size; ///< Size of this structure in bytes
592
593 UINT_32 pitch; ///< Pitch in elements (in blocks for compressed formats)
594 UINT_32 height; ///< Height in elements (in blocks for compressed formats)
595 UINT_32 depth; ///< Number of slice/depth
596 UINT_64 surfSize; ///< Surface size in bytes
597 AddrTileMode tileMode; ///< Actual tile mode. May differ from that in input
598 UINT_32 baseAlign; ///< Base address alignment
599 UINT_32 pitchAlign; ///< Pitch alignment, in elements
600 UINT_32 heightAlign; ///< Height alignment, in elements
601 UINT_32 depthAlign; ///< Depth alignment, aligned to thickness, for 3d texture
602 UINT_32 bpp; ///< Bits per elements (e.g. blocks for BCn, 1/3 for 96bit)
603 UINT_32 pixelPitch; ///< Pitch in original pixels
604 UINT_32 pixelHeight; ///< Height in original pixels
605 UINT_32 pixelBits; ///< Original bits per pixel, passed from input
606 UINT_64 sliceSize; ///< Size of slice specified by input's slice
607 /// The result is controlled by surface flags & createFlags
608 /// By default this value equals to surfSize for volume
609 UINT_32 pitchTileMax; ///< PITCH_TILE_MAX value for h/w register
610 UINT_32 heightTileMax; ///< HEIGHT_TILE_MAX value for h/w register
611 UINT_32 sliceTileMax; ///< SLICE_TILE_MAX value for h/w register
612
613 UINT_32 numSamples; ///< Pass the effective numSamples processed in this call
614
615 /// r800 and later HWL parameters
616 ADDR_TILEINFO* pTileInfo; ///< Tile parameters used. Filled in if 0 on input
617 AddrTileType tileType; ///< Micro tiling type, only valid when tileIndex != -1
618 INT_32 tileIndex; ///< Tile index, MAY be "downgraded"
619
620 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
621 /// Output flags
622 struct
623 {
624 /// Special information to work around SI mipmap swizzle bug UBTS #317508
625 UINT_32 last2DLevel : 1; ///< TRUE if this is the last 2D(3D) tiled
626 ///< Only meaningful when create flag checkLast2DLevel is set
627 UINT_32 tcCompatible : 1; ///< If the surface can be shader compatible
628 UINT_32 dccUnsupport : 1; ///< If the surface can support DCC compressed rendering
629 UINT_32 prtTileIndex : 1; ///< SI only, indicate the returned tile index is for PRT
630 ///< If address lib return true for mip 0, client should set prt flag
631 ///< for child mips in subsequent compute surface info calls
632 UINT_32 reserved :28; ///< Reserved bits
633 };
634
635 UINT_32 equationIndex; ///< Equation index in the equation table;
636
637 UINT_32 blockWidth; ///< Width in element inside one block(1D->Micro, 2D->Macro)
638 UINT_32 blockHeight; ///< Height in element inside one block(1D->Micro, 2D->Macro)
639 UINT_32 blockSlices; ///< Slice number inside one block(1D->Micro, 2D->Macro)
640
641 /// Stereo info
642 ADDR_QBSTEREOINFO* pStereoInfo;///< Stereo information, needed when .qbStereo flag is TRUE
643
644 INT_32 stencilTileIdx; ///< stencil tile index output when matchStencilTileCfg was set
645 } ADDR_COMPUTE_SURFACE_INFO_OUTPUT;
646
647 /**
648 ****************************************************************************************************
649 * AddrComputeSurfaceInfo
650 *
651 * @brief
652 * Compute surface width/height/depth/alignments and suitable tiling mode
653 ****************************************************************************************************
654 */
655 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceInfo(
656 ADDR_HANDLE hLib,
657 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
658 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut);
659
660
661
662 /**
663 ****************************************************************************************************
664 * ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
665 *
666 * @brief
667 * Input structure for AddrComputeSurfaceAddrFromCoord
668 ****************************************************************************************************
669 */
670 typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
671 {
672 UINT_32 size; ///< Size of this structure in bytes
673
674 UINT_32 x; ///< X coordinate
675 UINT_32 y; ///< Y coordinate
676 UINT_32 slice; ///< Slice index
677 UINT_32 sample; ///< Sample index, use fragment index for EQAA
678
679 UINT_32 bpp; ///< Bits per pixel
680 UINT_32 pitch; ///< Surface pitch, in pixels
681 UINT_32 height; ///< Surface height, in pixels
682 UINT_32 numSlices; ///< Surface depth
683 UINT_32 numSamples; ///< Number of samples
684
685 AddrTileMode tileMode; ///< Tile mode
686 BOOL_32 isDepth; ///< TRUE if the surface uses depth sample ordering within
687 /// micro tile. Textures can also choose depth sample order
688 UINT_32 tileBase; ///< Base offset (in bits) inside micro tile which handles
689 /// the case that components are stored separately
690 UINT_32 compBits; ///< The component bits actually needed(for planar surface)
691
692 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
693 /// number of samples for normal AA; Set it to the
694 /// number of fragments for EQAA
695 /// r800 and later HWL parameters
696 // Used for 1D tiling above
697 AddrTileType tileType; ///< See defintion of AddrTileType
698 struct
699 {
700 UINT_32 ignoreSE : 1; ///< TRUE if shader engines are ignored. This is texture
701 /// only flag. Only non-RT texture can set this to TRUE
702 UINT_32 reserved :31; ///< Reserved for future use.
703 };
704 // 2D tiling needs following structure
705 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
706 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
707 /// while the global useTileIndex is set to 1
708 union
709 {
710 struct
711 {
712 UINT_32 bankSwizzle; ///< Bank swizzle
713 UINT_32 pipeSwizzle; ///< Pipe swizzle
714 };
715 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
716 };
717 } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
718
719 /**
720 ****************************************************************************************************
721 * ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
722 *
723 * @brief
724 * Output structure for AddrComputeSurfaceAddrFromCoord
725 ****************************************************************************************************
726 */
727 typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
728 {
729 UINT_32 size; ///< Size of this structure in bytes
730
731 UINT_64 addr; ///< Byte address
732 UINT_32 bitPosition; ///< Bit position within surfaceAddr, 0-7.
733 /// For surface bpp < 8, e.g. FMT_1.
734 UINT_32 prtBlockIndex; ///< Index of a PRT tile (64K block)
735 } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
736
737 /**
738 ****************************************************************************************************
739 * AddrComputeSurfaceAddrFromCoord
740 *
741 * @brief
742 * Compute surface address from a given coordinate.
743 ****************************************************************************************************
744 */
745 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceAddrFromCoord(
746 ADDR_HANDLE hLib,
747 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
748 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut);
749
750
751
752 /**
753 ****************************************************************************************************
754 * ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
755 *
756 * @brief
757 * Input structure for AddrComputeSurfaceCoordFromAddr
758 ****************************************************************************************************
759 */
760 typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
761 {
762 UINT_32 size; ///< Size of this structure in bytes
763
764 UINT_64 addr; ///< Address in bytes
765 UINT_32 bitPosition; ///< Bit position in addr. 0-7. for surface bpp < 8,
766 /// e.g. FMT_1;
767 UINT_32 bpp; ///< Bits per pixel
768 UINT_32 pitch; ///< Pitch, in pixels
769 UINT_32 height; ///< Height in pixels
770 UINT_32 numSlices; ///< Surface depth
771 UINT_32 numSamples; ///< Number of samples
772
773 AddrTileMode tileMode; ///< Tile mode
774 BOOL_32 isDepth; ///< Surface uses depth sample ordering within micro tile.
775 /// Note: Textures can choose depth sample order as well.
776 UINT_32 tileBase; ///< Base offset (in bits) inside micro tile which handles
777 /// the case that components are stored separately
778 UINT_32 compBits; ///< The component bits actually needed(for planar surface)
779
780 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
781 /// number of samples for normal AA; Set it to the
782 /// number of fragments for EQAA
783 /// r800 and later HWL parameters
784 // Used for 1D tiling above
785 AddrTileType tileType; ///< See defintion of AddrTileType
786 struct
787 {
788 UINT_32 ignoreSE : 1; ///< TRUE if shader engines are ignored. This is texture
789 /// only flag. Only non-RT texture can set this to TRUE
790 UINT_32 reserved :31; ///< Reserved for future use.
791 };
792 // 2D tiling needs following structure
793 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
794 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
795 /// while the global useTileIndex is set to 1
796 union
797 {
798 struct
799 {
800 UINT_32 bankSwizzle; ///< Bank swizzle
801 UINT_32 pipeSwizzle; ///< Pipe swizzle
802 };
803 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
804 };
805 } ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT;
806
807 /**
808 ****************************************************************************************************
809 * ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
810 *
811 * @brief
812 * Output structure for AddrComputeSurfaceCoordFromAddr
813 ****************************************************************************************************
814 */
815 typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
816 {
817 UINT_32 size; ///< Size of this structure in bytes
818
819 UINT_32 x; ///< X coordinate
820 UINT_32 y; ///< Y coordinate
821 UINT_32 slice; ///< Index of slices
822 UINT_32 sample; ///< Index of samples, means fragment index for EQAA
823 } ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT;
824
825 /**
826 ****************************************************************************************************
827 * AddrComputeSurfaceCoordFromAddr
828 *
829 * @brief
830 * Compute coordinate from a given surface address
831 ****************************************************************************************************
832 */
833 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceCoordFromAddr(
834 ADDR_HANDLE hLib,
835 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
836 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut);
837
838 ////////////////////////////////////////////////////////////////////////////////////////////////////
839 // HTile functions
840 ////////////////////////////////////////////////////////////////////////////////////////////////////
841
842 /**
843 ****************************************************************************************************
844 * ADDR_HTILE_FLAGS
845 *
846 * @brief
847 * HTILE flags
848 ****************************************************************************************************
849 */
850 typedef union _ADDR_HTILE_FLAGS
851 {
852 struct
853 {
854 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable
855 UINT_32 skipTcCompatSizeAlign : 1; ///< Flag indicates that addrLib will not align htile
856 /// size to 256xBankxPipe when computing tc-compatible
857 /// htile info.
858 UINT_32 reserved : 30; ///< Reserved bits
859 };
860
861 UINT_32 value;
862 } ADDR_HTILE_FLAGS;
863
864 /**
865 ****************************************************************************************************
866 * ADDR_COMPUTE_HTILE_INFO_INPUT
867 *
868 * @brief
869 * Input structure of AddrComputeHtileInfo
870 ****************************************************************************************************
871 */
872 typedef struct _ADDR_COMPUTE_HTILE_INFO_INPUT
873 {
874 UINT_32 size; ///< Size of this structure in bytes
875
876 ADDR_HTILE_FLAGS flags; ///< HTILE flags
877 UINT_32 pitch; ///< Surface pitch, in pixels
878 UINT_32 height; ///< Surface height, in pixels
879 UINT_32 numSlices; ///< Number of slices
880 BOOL_32 isLinear; ///< Linear or tiled HTILE layout
881 AddrHtileBlockSize blockWidth; ///< 4 or 8. EG above only support 8
882 AddrHtileBlockSize blockHeight; ///< 4 or 8. EG above only support 8
883 ADDR_TILEINFO* pTileInfo; ///< Tile info
884
885 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
886 /// while the global useTileIndex is set to 1
887 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
888 ///< README: When tileIndex is not -1, this must be valid
889 } ADDR_COMPUTE_HTILE_INFO_INPUT;
890
891 /**
892 ****************************************************************************************************
893 * ADDR_COMPUTE_HTILE_INFO_OUTPUT
894 *
895 * @brief
896 * Output structure of AddrComputeHtileInfo
897 ****************************************************************************************************
898 */
899 typedef struct _ADDR_COMPUTE_HTILE_INFO_OUTPUT
900 {
901 UINT_32 size; ///< Size of this structure in bytes
902
903 UINT_32 pitch; ///< Pitch in pixels of depth buffer represented in this
904 /// HTile buffer. This might be larger than original depth
905 /// buffer pitch when called with an unaligned pitch.
906 UINT_32 height; ///< Height in pixels, as above
907 UINT_64 htileBytes; ///< Size of HTILE buffer, in bytes
908 UINT_32 baseAlign; ///< Base alignment
909 UINT_32 bpp; ///< Bits per pixel for HTILE is how many bits for an 8x8 block!
910 UINT_32 macroWidth; ///< Macro width in pixels, actually squared cache shape
911 UINT_32 macroHeight; ///< Macro height in pixels
912 UINT_64 sliceSize; ///< Slice size, in bytes.
913 BOOL_32 sliceInterleaved; ///< Flag to indicate if different slice's htile is interleaved
914 /// Compute engine clear can't be used if htile is interleaved
915 BOOL_32 nextMipLevelCompressible; ///< Flag to indicate whether HTILE can be enabled in
916 /// next mip level, it also indicates if memory set based
917 /// fast clear can be used for current mip level.
918 } ADDR_COMPUTE_HTILE_INFO_OUTPUT;
919
920 /**
921 ****************************************************************************************************
922 * AddrComputeHtileInfo
923 *
924 * @brief
925 * Compute Htile pitch, height, base alignment and size in bytes
926 ****************************************************************************************************
927 */
928 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileInfo(
929 ADDR_HANDLE hLib,
930 const ADDR_COMPUTE_HTILE_INFO_INPUT* pIn,
931 ADDR_COMPUTE_HTILE_INFO_OUTPUT* pOut);
932
933
934
935 /**
936 ****************************************************************************************************
937 * ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
938 *
939 * @brief
940 * Input structure for AddrComputeHtileAddrFromCoord
941 ****************************************************************************************************
942 */
943 typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
944 {
945 UINT_32 size; ///< Size of this structure in bytes
946
947 UINT_32 pitch; ///< Pitch, in pixels
948 UINT_32 height; ///< Height in pixels
949 UINT_32 x; ///< X coordinate
950 UINT_32 y; ///< Y coordinate
951 UINT_32 slice; ///< Index of slice
952 UINT_32 numSlices; ///< Number of slices
953 BOOL_32 isLinear; ///< Linear or tiled HTILE layout
954 ADDR_HTILE_FLAGS flags; ///< htile flags
955 AddrHtileBlockSize blockWidth; ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8
956 AddrHtileBlockSize blockHeight; ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8
957 ADDR_TILEINFO* pTileInfo; ///< Tile info
958
959 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
960 /// while the global useTileIndex is set to 1
961 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
962 ///< README: When tileIndex is not -1, this must be valid
963 UINT_32 bpp; ///< depth/stencil buffer bit per pixel size
964 UINT_32 zStencilAddr; ///< tcCompatible Z/Stencil surface address
965 } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT;
966
967 /**
968 ****************************************************************************************************
969 * ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
970 *
971 * @brief
972 * Output structure for AddrComputeHtileAddrFromCoord
973 ****************************************************************************************************
974 */
975 typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
976 {
977 UINT_32 size; ///< Size of this structure in bytes
978
979 UINT_64 addr; ///< Address in bytes
980 UINT_32 bitPosition; ///< Bit position, 0 or 4. CMASK and HTILE shares some lib method.
981 /// So we keep bitPosition for HTILE as well
982 } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT;
983
984 /**
985 ****************************************************************************************************
986 * AddrComputeHtileAddrFromCoord
987 *
988 * @brief
989 * Compute Htile address according to coordinates (of depth buffer)
990 ****************************************************************************************************
991 */
992 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileAddrFromCoord(
993 ADDR_HANDLE hLib,
994 const ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn,
995 ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut);
996
997
998
999 /**
1000 ****************************************************************************************************
1001 * ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT
1002 *
1003 * @brief
1004 * Input structure for AddrComputeHtileCoordFromAddr
1005 ****************************************************************************************************
1006 */
1007 typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT
1008 {
1009 UINT_32 size; ///< Size of this structure in bytes
1010
1011 UINT_64 addr; ///< Address
1012 UINT_32 bitPosition; ///< Bit position 0 or 4. CMASK and HTILE share some methods
1013 /// so we keep bitPosition for HTILE as well
1014 UINT_32 pitch; ///< Pitch, in pixels
1015 UINT_32 height; ///< Height, in pixels
1016 UINT_32 numSlices; ///< Number of slices
1017 BOOL_32 isLinear; ///< Linear or tiled HTILE layout
1018 AddrHtileBlockSize blockWidth; ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8
1019 AddrHtileBlockSize blockHeight; ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8
1020 ADDR_TILEINFO* pTileInfo; ///< Tile info
1021
1022 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1023 /// while the global useTileIndex is set to 1
1024 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1025 ///< README: When tileIndex is not -1, this must be valid
1026 } ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT;
1027
1028 /**
1029 ****************************************************************************************************
1030 * ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
1031 *
1032 * @brief
1033 * Output structure for AddrComputeHtileCoordFromAddr
1034 ****************************************************************************************************
1035 */
1036 typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
1037 {
1038 UINT_32 size; ///< Size of this structure in bytes
1039
1040 UINT_32 x; ///< X coordinate
1041 UINT_32 y; ///< Y coordinate
1042 UINT_32 slice; ///< Slice index
1043 } ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT;
1044
1045 /**
1046 ****************************************************************************************************
1047 * AddrComputeHtileCoordFromAddr
1048 *
1049 * @brief
1050 * Compute coordinates within depth buffer (1st pixel of a micro tile) according to
1051 * Htile address
1052 ****************************************************************************************************
1053 */
1054 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileCoordFromAddr(
1055 ADDR_HANDLE hLib,
1056 const ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn,
1057 ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut);
1058
1059
1060
1061 ////////////////////////////////////////////////////////////////////////////////////////////////////
1062 // C-mask functions
1063 ////////////////////////////////////////////////////////////////////////////////////////////////////
1064
1065 /**
1066 ****************************************************************************************************
1067 * ADDR_CMASK_FLAGS
1068 *
1069 * @brief
1070 * CMASK flags
1071 ****************************************************************************************************
1072 */
1073 typedef union _ADDR_CMASK_FLAGS
1074 {
1075 struct
1076 {
1077 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable
1078 UINT_32 reserved :31; ///< Reserved bits
1079 };
1080
1081 UINT_32 value;
1082 } ADDR_CMASK_FLAGS;
1083
1084 /**
1085 ****************************************************************************************************
1086 * ADDR_COMPUTE_CMASK_INFO_INPUT
1087 *
1088 * @brief
1089 * Input structure of AddrComputeCmaskInfo
1090 ****************************************************************************************************
1091 */
1092 typedef struct _ADDR_COMPUTE_CMASKINFO_INPUT
1093 {
1094 UINT_32 size; ///< Size of this structure in bytes
1095
1096 ADDR_CMASK_FLAGS flags; ///< CMASK flags
1097 UINT_32 pitch; ///< Pitch, in pixels, of color buffer
1098 UINT_32 height; ///< Height, in pixels, of color buffer
1099 UINT_32 numSlices; ///< Number of slices, of color buffer
1100 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear
1101 ADDR_TILEINFO* pTileInfo; ///< Tile info
1102
1103 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1104 /// while the global useTileIndex is set to 1
1105 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1106 ///< README: When tileIndex is not -1, this must be valid
1107 } ADDR_COMPUTE_CMASK_INFO_INPUT;
1108
1109 /**
1110 ****************************************************************************************************
1111 * ADDR_COMPUTE_CMASK_INFO_OUTPUT
1112 *
1113 * @brief
1114 * Output structure of AddrComputeCmaskInfo
1115 ****************************************************************************************************
1116 */
1117 typedef struct _ADDR_COMPUTE_CMASK_INFO_OUTPUT
1118 {
1119 UINT_32 size; ///< Size of this structure in bytes
1120
1121 UINT_32 pitch; ///< Pitch in pixels of color buffer which
1122 /// this Cmask matches. The size might be larger than
1123 /// original color buffer pitch when called with
1124 /// an unaligned pitch.
1125 UINT_32 height; ///< Height in pixels, as above
1126 UINT_64 cmaskBytes; ///< Size in bytes of CMask buffer
1127 UINT_32 baseAlign; ///< Base alignment
1128 UINT_32 blockMax; ///< Cmask block size. Need this to set CB_COLORn_MASK register
1129 UINT_32 macroWidth; ///< Macro width in pixels, actually squared cache shape
1130 UINT_32 macroHeight; ///< Macro height in pixels
1131 UINT_64 sliceSize; ///< Slice size, in bytes.
1132 } ADDR_COMPUTE_CMASK_INFO_OUTPUT;
1133
1134 /**
1135 ****************************************************************************************************
1136 * AddrComputeCmaskInfo
1137 *
1138 * @brief
1139 * Compute Cmask pitch, height, base alignment and size in bytes from color buffer
1140 * info
1141 ****************************************************************************************************
1142 */
1143 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskInfo(
1144 ADDR_HANDLE hLib,
1145 const ADDR_COMPUTE_CMASK_INFO_INPUT* pIn,
1146 ADDR_COMPUTE_CMASK_INFO_OUTPUT* pOut);
1147
1148
1149
1150 /**
1151 ****************************************************************************************************
1152 * ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
1153 *
1154 * @brief
1155 * Input structure for AddrComputeCmaskAddrFromCoord
1156 *
1157 ****************************************************************************************************
1158 */
1159 typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
1160 {
1161 UINT_32 size; ///< Size of this structure in bytes
1162 UINT_32 x; ///< X coordinate
1163 UINT_32 y; ///< Y coordinate
1164 UINT_64 fmaskAddr; ///< Fmask addr for tc compatible Cmask
1165 UINT_32 slice; ///< Slice index
1166 UINT_32 pitch; ///< Pitch in pixels, of color buffer
1167 UINT_32 height; ///< Height in pixels, of color buffer
1168 UINT_32 numSlices; ///< Number of slices
1169 UINT_32 bpp;
1170 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear
1171 ADDR_CMASK_FLAGS flags; ///< CMASK flags
1172 ADDR_TILEINFO* pTileInfo; ///< Tile info
1173
1174 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1175 ///< while the global useTileIndex is set to 1
1176 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1177 ///< README: When tileIndex is not -1, this must be valid
1178 } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT;
1179
1180 /**
1181 ****************************************************************************************************
1182 * ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
1183 *
1184 * @brief
1185 * Output structure for AddrComputeCmaskAddrFromCoord
1186 ****************************************************************************************************
1187 */
1188 typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
1189 {
1190 UINT_32 size; ///< Size of this structure in bytes
1191
1192 UINT_64 addr; ///< CMASK address in bytes
1193 UINT_32 bitPosition; ///< Bit position within addr, 0-7. CMASK is 4 bpp,
1194 /// so the address may be located in bit 0 (0) or 4 (4)
1195 } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT;
1196
1197 /**
1198 ****************************************************************************************************
1199 * AddrComputeCmaskAddrFromCoord
1200 *
1201 * @brief
1202 * Compute Cmask address according to coordinates (of MSAA color buffer)
1203 ****************************************************************************************************
1204 */
1205 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskAddrFromCoord(
1206 ADDR_HANDLE hLib,
1207 const ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn,
1208 ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut);
1209
1210
1211
1212 /**
1213 ****************************************************************************************************
1214 * ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT
1215 *
1216 * @brief
1217 * Input structure for AddrComputeCmaskCoordFromAddr
1218 ****************************************************************************************************
1219 */
1220 typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT
1221 {
1222 UINT_32 size; ///< Size of this structure in bytes
1223
1224 UINT_64 addr; ///< CMASK address in bytes
1225 UINT_32 bitPosition; ///< Bit position within addr, 0-7. CMASK is 4 bpp,
1226 /// so the address may be located in bit 0 (0) or 4 (4)
1227 UINT_32 pitch; ///< Pitch, in pixels
1228 UINT_32 height; ///< Height in pixels
1229 UINT_32 numSlices; ///< Number of slices
1230 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear
1231 ADDR_TILEINFO* pTileInfo; ///< Tile info
1232
1233 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1234 /// while the global useTileIndex is set to 1
1235 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1236 ///< README: When tileIndex is not -1, this must be valid
1237 } ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT;
1238
1239 /**
1240 ****************************************************************************************************
1241 * ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
1242 *
1243 * @brief
1244 * Output structure for AddrComputeCmaskCoordFromAddr
1245 ****************************************************************************************************
1246 */
1247 typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
1248 {
1249 UINT_32 size; ///< Size of this structure in bytes
1250
1251 UINT_32 x; ///< X coordinate
1252 UINT_32 y; ///< Y coordinate
1253 UINT_32 slice; ///< Slice index
1254 } ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT;
1255
1256 /**
1257 ****************************************************************************************************
1258 * AddrComputeCmaskCoordFromAddr
1259 *
1260 * @brief
1261 * Compute coordinates within color buffer (1st pixel of a micro tile) according to
1262 * Cmask address
1263 ****************************************************************************************************
1264 */
1265 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskCoordFromAddr(
1266 ADDR_HANDLE hLib,
1267 const ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT* pIn,
1268 ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT* pOut);
1269
1270
1271
1272 ////////////////////////////////////////////////////////////////////////////////////////////////////
1273 // F-mask functions
1274 ////////////////////////////////////////////////////////////////////////////////////////////////////
1275
1276 /**
1277 ****************************************************************************************************
1278 * ADDR_COMPUTE_FMASK_INFO_INPUT
1279 *
1280 * @brief
1281 * Input structure for AddrComputeFmaskInfo
1282 ****************************************************************************************************
1283 */
1284 typedef struct _ADDR_COMPUTE_FMASK_INFO_INPUT
1285 {
1286 UINT_32 size; ///< Size of this structure in bytes
1287
1288 AddrTileMode tileMode; ///< Tile mode
1289 UINT_32 pitch; ///< Surface pitch, in pixels
1290 UINT_32 height; ///< Surface height, in pixels
1291 UINT_32 numSlices; ///< Number of slice/depth
1292 UINT_32 numSamples; ///< Number of samples
1293 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
1294 /// number of samples for normal AA; Set it to the
1295 /// number of fragments for EQAA
1296 /// r800 and later HWL parameters
1297 struct
1298 {
1299 UINT_32 resolved: 1; ///< TRUE if the surface is for resolved fmask, only used
1300 /// by H/W clients. S/W should always set it to FALSE.
1301 UINT_32 reserved: 31; ///< Reserved for future use.
1302 };
1303 ADDR_TILEINFO* pTileInfo; ///< 2D tiling parameters. Clients must give valid data
1304 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1305 /// while the global useTileIndex is set to 1
1306 } ADDR_COMPUTE_FMASK_INFO_INPUT;
1307
1308 /**
1309 ****************************************************************************************************
1310 * ADDR_COMPUTE_FMASK_INFO_OUTPUT
1311 *
1312 * @brief
1313 * Output structure for AddrComputeFmaskInfo
1314 ****************************************************************************************************
1315 */
1316 typedef struct _ADDR_COMPUTE_FMASK_INFO_OUTPUT
1317 {
1318 UINT_32 size; ///< Size of this structure in bytes
1319
1320 UINT_32 pitch; ///< Pitch of fmask in pixels
1321 UINT_32 height; ///< Height of fmask in pixels
1322 UINT_32 numSlices; ///< Slices of fmask
1323 UINT_64 fmaskBytes; ///< Size of fmask in bytes
1324 UINT_32 baseAlign; ///< Base address alignment
1325 UINT_32 pitchAlign; ///< Pitch alignment
1326 UINT_32 heightAlign; ///< Height alignment
1327 UINT_32 bpp; ///< Bits per pixel of FMASK is: number of bit planes
1328 UINT_32 numSamples; ///< Number of samples, used for dump, export this since input
1329 /// may be changed in 9xx and above
1330 /// r800 and later HWL parameters
1331 ADDR_TILEINFO* pTileInfo; ///< Tile parameters used. Fmask can have different
1332 /// bank_height from color buffer
1333 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1334 /// while the global useTileIndex is set to 1
1335 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1336 UINT_64 sliceSize; ///< Size of slice in bytes
1337 } ADDR_COMPUTE_FMASK_INFO_OUTPUT;
1338
1339 /**
1340 ****************************************************************************************************
1341 * AddrComputeFmaskInfo
1342 *
1343 * @brief
1344 * Compute Fmask pitch/height/depth/alignments and size in bytes
1345 ****************************************************************************************************
1346 */
1347 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskInfo(
1348 ADDR_HANDLE hLib,
1349 const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn,
1350 ADDR_COMPUTE_FMASK_INFO_OUTPUT* pOut);
1351
1352
1353
1354 /**
1355 ****************************************************************************************************
1356 * ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
1357 *
1358 * @brief
1359 * Input structure for AddrComputeFmaskAddrFromCoord
1360 ****************************************************************************************************
1361 */
1362 typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
1363 {
1364 UINT_32 size; ///< Size of this structure in bytes
1365
1366 UINT_32 x; ///< X coordinate
1367 UINT_32 y; ///< Y coordinate
1368 UINT_32 slice; ///< Slice index
1369 UINT_32 plane; ///< Plane number
1370 UINT_32 sample; ///< Sample index (fragment index for EQAA)
1371
1372 UINT_32 pitch; ///< Surface pitch, in pixels
1373 UINT_32 height; ///< Surface height, in pixels
1374 UINT_32 numSamples; ///< Number of samples
1375 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
1376 /// number of samples for normal AA; Set it to the
1377 /// number of fragments for EQAA
1378
1379 AddrTileMode tileMode; ///< Tile mode
1380 union
1381 {
1382 struct
1383 {
1384 UINT_32 bankSwizzle; ///< Bank swizzle
1385 UINT_32 pipeSwizzle; ///< Pipe swizzle
1386 };
1387 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
1388 };
1389
1390 /// r800 and later HWL parameters
1391 struct
1392 {
1393 UINT_32 resolved: 1; ///< TRUE if this is a resolved fmask, used by H/W clients
1394 UINT_32 ignoreSE: 1; ///< TRUE if shader engines are ignored.
1395 UINT_32 reserved: 30; ///< Reserved for future use.
1396 };
1397 ADDR_TILEINFO* pTileInfo; ///< 2D tiling parameters. Client must provide all data
1398
1399 } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT;
1400
1401 /**
1402 ****************************************************************************************************
1403 * ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
1404 *
1405 * @brief
1406 * Output structure for AddrComputeFmaskAddrFromCoord
1407 ****************************************************************************************************
1408 */
1409 typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
1410 {
1411 UINT_32 size; ///< Size of this structure in bytes
1412
1413 UINT_64 addr; ///< Fmask address
1414 UINT_32 bitPosition; ///< Bit position within fmaskAddr, 0-7.
1415 } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT;
1416
1417 /**
1418 ****************************************************************************************************
1419 * AddrComputeFmaskAddrFromCoord
1420 *
1421 * @brief
1422 * Compute Fmask address according to coordinates (x,y,slice,sample,plane)
1423 ****************************************************************************************************
1424 */
1425 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskAddrFromCoord(
1426 ADDR_HANDLE hLib,
1427 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn,
1428 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut);
1429
1430
1431
1432 /**
1433 ****************************************************************************************************
1434 * ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
1435 *
1436 * @brief
1437 * Input structure for AddrComputeFmaskCoordFromAddr
1438 ****************************************************************************************************
1439 */
1440 typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
1441 {
1442 UINT_32 size; ///< Size of this structure in bytes
1443
1444 UINT_64 addr; ///< Address
1445 UINT_32 bitPosition; ///< Bit position within addr, 0-7.
1446
1447 UINT_32 pitch; ///< Pitch, in pixels
1448 UINT_32 height; ///< Height in pixels
1449 UINT_32 numSamples; ///< Number of samples
1450 UINT_32 numFrags; ///< Number of fragments
1451 AddrTileMode tileMode; ///< Tile mode
1452 union
1453 {
1454 struct
1455 {
1456 UINT_32 bankSwizzle; ///< Bank swizzle
1457 UINT_32 pipeSwizzle; ///< Pipe swizzle
1458 };
1459 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
1460 };
1461
1462 /// r800 and later HWL parameters
1463 struct
1464 {
1465 UINT_32 resolved: 1; ///< TRUE if this is a resolved fmask, used by HW components
1466 UINT_32 ignoreSE: 1; ///< TRUE if shader engines are ignored.
1467 UINT_32 reserved: 30; ///< Reserved for future use.
1468 };
1469 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
1470
1471 } ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT;
1472
1473 /**
1474 ****************************************************************************************************
1475 * ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
1476 *
1477 * @brief
1478 * Output structure for AddrComputeFmaskCoordFromAddr
1479 ****************************************************************************************************
1480 */
1481 typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
1482 {
1483 UINT_32 size; ///< Size of this structure in bytes
1484
1485 UINT_32 x; ///< X coordinate
1486 UINT_32 y; ///< Y coordinate
1487 UINT_32 slice; ///< Slice index
1488 UINT_32 plane; ///< Plane number
1489 UINT_32 sample; ///< Sample index (fragment index for EQAA)
1490 } ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT;
1491
1492 /**
1493 ****************************************************************************************************
1494 * AddrComputeFmaskCoordFromAddr
1495 *
1496 * @brief
1497 * Compute FMASK coordinate from an given address
1498 ****************************************************************************************************
1499 */
1500 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskCoordFromAddr(
1501 ADDR_HANDLE hLib,
1502 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn,
1503 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut);
1504
1505
1506
1507 ////////////////////////////////////////////////////////////////////////////////////////////////////
1508 // Element/utility functions
1509 ////////////////////////////////////////////////////////////////////////////////////////////////////
1510
1511 /**
1512 ****************************************************************************************************
1513 * AddrGetVersion
1514 *
1515 * @brief
1516 * Get AddrLib version number
1517 ****************************************************************************************************
1518 */
1519 UINT_32 ADDR_API AddrGetVersion(ADDR_HANDLE hLib);
1520
1521 /**
1522 ****************************************************************************************************
1523 * AddrUseTileIndex
1524 *
1525 * @brief
1526 * Return TRUE if tileIndex is enabled in this address library
1527 ****************************************************************************************************
1528 */
1529 BOOL_32 ADDR_API AddrUseTileIndex(ADDR_HANDLE hLib);
1530
1531 /**
1532 ****************************************************************************************************
1533 * AddrUseCombinedSwizzle
1534 *
1535 * @brief
1536 * Return TRUE if combined swizzle is enabled in this address library
1537 ****************************************************************************************************
1538 */
1539 BOOL_32 ADDR_API AddrUseCombinedSwizzle(ADDR_HANDLE hLib);
1540
1541 /**
1542 ****************************************************************************************************
1543 * ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
1544 *
1545 * @brief
1546 * Input structure of AddrExtractBankPipeSwizzle
1547 ****************************************************************************************************
1548 */
1549 typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
1550 {
1551 UINT_32 size; ///< Size of this structure in bytes
1552
1553 UINT_32 base256b; ///< Base256b value
1554
1555 /// r800 and later HWL parameters
1556 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
1557
1558 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1559 /// while the global useTileIndex is set to 1
1560 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1561 ///< README: When tileIndex is not -1, this must be valid
1562 } ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT;
1563
1564 /**
1565 ****************************************************************************************************
1566 * ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
1567 *
1568 * @brief
1569 * Output structure of AddrExtractBankPipeSwizzle
1570 ****************************************************************************************************
1571 */
1572 typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
1573 {
1574 UINT_32 size; ///< Size of this structure in bytes
1575
1576 UINT_32 bankSwizzle; ///< Bank swizzle
1577 UINT_32 pipeSwizzle; ///< Pipe swizzle
1578 } ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT;
1579
1580 /**
1581 ****************************************************************************************************
1582 * AddrExtractBankPipeSwizzle
1583 *
1584 * @brief
1585 * Extract Bank and Pipe swizzle from base256b
1586 * @return
1587 * ADDR_OK if no error
1588 ****************************************************************************************************
1589 */
1590 ADDR_E_RETURNCODE ADDR_API AddrExtractBankPipeSwizzle(
1591 ADDR_HANDLE hLib,
1592 const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT* pIn,
1593 ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT* pOut);
1594
1595
1596 /**
1597 ****************************************************************************************************
1598 * ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT
1599 *
1600 * @brief
1601 * Input structure of AddrCombineBankPipeSwizzle
1602 ****************************************************************************************************
1603 */
1604 typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT
1605 {
1606 UINT_32 size; ///< Size of this structure in bytes
1607
1608 UINT_32 bankSwizzle; ///< Bank swizzle
1609 UINT_32 pipeSwizzle; ///< Pipe swizzle
1610 UINT_64 baseAddr; ///< Base address (leave it zero for driver clients)
1611
1612 /// r800 and later HWL parameters
1613 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
1614
1615 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1616 /// while the global useTileIndex is set to 1
1617 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1618 ///< README: When tileIndex is not -1, this must be valid
1619 } ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT;
1620
1621 /**
1622 ****************************************************************************************************
1623 * ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT
1624 *
1625 * @brief
1626 * Output structure of AddrCombineBankPipeSwizzle
1627 ****************************************************************************************************
1628 */
1629 typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT
1630 {
1631 UINT_32 size; ///< Size of this structure in bytes
1632
1633 UINT_32 tileSwizzle; ///< Combined swizzle
1634 } ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT;
1635
1636 /**
1637 ****************************************************************************************************
1638 * AddrCombineBankPipeSwizzle
1639 *
1640 * @brief
1641 * Combine Bank and Pipe swizzle
1642 * @return
1643 * ADDR_OK if no error
1644 * @note
1645 * baseAddr here is full MCAddress instead of base256b
1646 ****************************************************************************************************
1647 */
1648 ADDR_E_RETURNCODE ADDR_API AddrCombineBankPipeSwizzle(
1649 ADDR_HANDLE hLib,
1650 const ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT* pIn,
1651 ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT* pOut);
1652
1653
1654
1655 /**
1656 ****************************************************************************************************
1657 * ADDR_COMPUTE_SLICESWIZZLE_INPUT
1658 *
1659 * @brief
1660 * Input structure of AddrComputeSliceSwizzle
1661 ****************************************************************************************************
1662 */
1663 typedef struct _ADDR_COMPUTE_SLICESWIZZLE_INPUT
1664 {
1665 UINT_32 size; ///< Size of this structure in bytes
1666
1667 AddrTileMode tileMode; ///< Tile Mode
1668 UINT_32 baseSwizzle; ///< Base tile swizzle
1669 UINT_32 slice; ///< Slice index
1670 UINT_64 baseAddr; ///< Base address, driver should leave it 0 in most cases
1671
1672 /// r800 and later HWL parameters
1673 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Actually banks needed here!
1674
1675 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1676 /// while the global useTileIndex is set to 1
1677 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1678 ///< README: When tileIndex is not -1, this must be valid
1679 } ADDR_COMPUTE_SLICESWIZZLE_INPUT;
1680
1681
1682
1683 /**
1684 ****************************************************************************************************
1685 * ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
1686 *
1687 * @brief
1688 * Output structure of AddrComputeSliceSwizzle
1689 ****************************************************************************************************
1690 */
1691 typedef struct _ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
1692 {
1693 UINT_32 size; ///< Size of this structure in bytes
1694
1695 UINT_32 tileSwizzle; ///< Recalculated tileSwizzle value
1696 } ADDR_COMPUTE_SLICESWIZZLE_OUTPUT;
1697
1698 /**
1699 ****************************************************************************************************
1700 * AddrComputeSliceSwizzle
1701 *
1702 * @brief
1703 * Extract Bank and Pipe swizzle from base256b
1704 * @return
1705 * ADDR_OK if no error
1706 ****************************************************************************************************
1707 */
1708 ADDR_E_RETURNCODE ADDR_API AddrComputeSliceSwizzle(
1709 ADDR_HANDLE hLib,
1710 const ADDR_COMPUTE_SLICESWIZZLE_INPUT* pIn,
1711 ADDR_COMPUTE_SLICESWIZZLE_OUTPUT* pOut);
1712
1713
1714 /**
1715 ****************************************************************************************************
1716 * AddrSwizzleGenOption
1717 *
1718 * @brief
1719 * Which swizzle generating options: legacy or linear
1720 ****************************************************************************************************
1721 */
1722 typedef enum _AddrSwizzleGenOption
1723 {
1724 ADDR_SWIZZLE_GEN_DEFAULT = 0, ///< As is in client driver implemention for swizzle
1725 ADDR_SWIZZLE_GEN_LINEAR = 1, ///< Using a linear increment of swizzle
1726 } AddrSwizzleGenOption;
1727
1728 /**
1729 ****************************************************************************************************
1730 * AddrSwizzleOption
1731 *
1732 * @brief
1733 * Controls how swizzle is generated
1734 ****************************************************************************************************
1735 */
1736 typedef union _ADDR_SWIZZLE_OPTION
1737 {
1738 struct
1739 {
1740 UINT_32 genOption : 1; ///< The way swizzle is generated, see AddrSwizzleGenOption
1741 UINT_32 reduceBankBit : 1; ///< TRUE if we need reduce swizzle bits
1742 UINT_32 reserved :30; ///< Reserved bits
1743 };
1744
1745 UINT_32 value;
1746
1747 } ADDR_SWIZZLE_OPTION;
1748
1749 /**
1750 ****************************************************************************************************
1751 * ADDR_COMPUTE_BASE_SWIZZLE_INPUT
1752 *
1753 * @brief
1754 * Input structure of AddrComputeBaseSwizzle
1755 ****************************************************************************************************
1756 */
1757 typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_INPUT
1758 {
1759 UINT_32 size; ///< Size of this structure in bytes
1760
1761 ADDR_SWIZZLE_OPTION option; ///< Swizzle option
1762 UINT_32 surfIndex; ///< Index of this surface type
1763 AddrTileMode tileMode; ///< Tile Mode
1764
1765 /// r800 and later HWL parameters
1766 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Actually banks needed here!
1767
1768 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1769 /// while the global useTileIndex is set to 1
1770 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1771 ///< README: When tileIndex is not -1, this must be valid
1772 } ADDR_COMPUTE_BASE_SWIZZLE_INPUT;
1773
1774 /**
1775 ****************************************************************************************************
1776 * ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
1777 *
1778 * @brief
1779 * Output structure of AddrComputeBaseSwizzle
1780 ****************************************************************************************************
1781 */
1782 typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
1783 {
1784 UINT_32 size; ///< Size of this structure in bytes
1785
1786 UINT_32 tileSwizzle; ///< Combined swizzle
1787 } ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT;
1788
1789 /**
1790 ****************************************************************************************************
1791 * AddrComputeBaseSwizzle
1792 *
1793 * @brief
1794 * Return a Combined Bank and Pipe swizzle base on surface based on surface type/index
1795 * @return
1796 * ADDR_OK if no error
1797 ****************************************************************************************************
1798 */
1799 ADDR_E_RETURNCODE ADDR_API AddrComputeBaseSwizzle(
1800 ADDR_HANDLE hLib,
1801 const ADDR_COMPUTE_BASE_SWIZZLE_INPUT* pIn,
1802 ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT* pOut);
1803
1804
1805
1806 /**
1807 ****************************************************************************************************
1808 * ELEM_GETEXPORTNORM_INPUT
1809 *
1810 * @brief
1811 * Input structure for ElemGetExportNorm
1812 *
1813 ****************************************************************************************************
1814 */
1815 typedef struct _ELEM_GETEXPORTNORM_INPUT
1816 {
1817 UINT_32 size; ///< Size of this structure in bytes
1818
1819 AddrColorFormat format; ///< Color buffer format; Client should use ColorFormat
1820 AddrSurfaceNumber num; ///< Surface number type; Client should use NumberType
1821 AddrSurfaceSwap swap; ///< Surface swap byte swap; Client should use SurfaceSwap
1822 UINT_32 numSamples; ///< Number of samples
1823 } ELEM_GETEXPORTNORM_INPUT;
1824
1825 /**
1826 ****************************************************************************************************
1827 * ElemGetExportNorm
1828 *
1829 * @brief
1830 * Helper function to check one format can be EXPORT_NUM, which is a register
1831 * CB_COLOR_INFO.SURFACE_FORMAT. FP16 can be reported as EXPORT_NORM for rv770 in r600
1832 * family
1833 * @note
1834 * The implementation is only for r600.
1835 * 00 - EXPORT_FULL: PS exports are 4 pixels with 4 components with 32-bits-per-component. (two
1836 * clocks per export)
1837 * 01 - EXPORT_NORM: PS exports are 4 pixels with 4 components with 16-bits-per-component. (one
1838 * clock per export)
1839 *
1840 ****************************************************************************************************
1841 */
1842 BOOL_32 ADDR_API ElemGetExportNorm(
1843 ADDR_HANDLE hLib,
1844 const ELEM_GETEXPORTNORM_INPUT* pIn);
1845
1846
1847
1848 /**
1849 ****************************************************************************************************
1850 * ELEM_FLT32TODEPTHPIXEL_INPUT
1851 *
1852 * @brief
1853 * Input structure for addrFlt32ToDepthPixel
1854 *
1855 ****************************************************************************************************
1856 */
1857 typedef struct _ELEM_FLT32TODEPTHPIXEL_INPUT
1858 {
1859 UINT_32 size; ///< Size of this structure in bytes
1860
1861 AddrDepthFormat format; ///< Depth buffer format
1862 ADDR_FLT_32 comps[2]; ///< Component values (Z/stencil)
1863 } ELEM_FLT32TODEPTHPIXEL_INPUT;
1864
1865 /**
1866 ****************************************************************************************************
1867 * ELEM_FLT32TODEPTHPIXEL_INPUT
1868 *
1869 * @brief
1870 * Output structure for ElemFlt32ToDepthPixel
1871 *
1872 ****************************************************************************************************
1873 */
1874 typedef struct _ELEM_FLT32TODEPTHPIXEL_OUTPUT
1875 {
1876 UINT_32 size; ///< Size of this structure in bytes
1877
1878 UINT_8* pPixel; ///< Real depth value. Same data type as depth buffer.
1879 /// Client must provide enough storage for this type.
1880 UINT_32 depthBase; ///< Tile base in bits for depth bits
1881 UINT_32 stencilBase; ///< Tile base in bits for stencil bits
1882 UINT_32 depthBits; ///< Bits for depth
1883 UINT_32 stencilBits; ///< Bits for stencil
1884 } ELEM_FLT32TODEPTHPIXEL_OUTPUT;
1885
1886 /**
1887 ****************************************************************************************************
1888 * ElemFlt32ToDepthPixel
1889 *
1890 * @brief
1891 * Convert a FLT_32 value to a depth/stencil pixel value
1892 *
1893 * @return
1894 * Return code
1895 *
1896 ****************************************************************************************************
1897 */
1898 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToDepthPixel(
1899 ADDR_HANDLE hLib,
1900 const ELEM_FLT32TODEPTHPIXEL_INPUT* pIn,
1901 ELEM_FLT32TODEPTHPIXEL_OUTPUT* pOut);
1902
1903
1904
1905 /**
1906 ****************************************************************************************************
1907 * ELEM_FLT32TOCOLORPIXEL_INPUT
1908 *
1909 * @brief
1910 * Input structure for addrFlt32ToColorPixel
1911 *
1912 ****************************************************************************************************
1913 */
1914 typedef struct _ELEM_FLT32TOCOLORPIXEL_INPUT
1915 {
1916 UINT_32 size; ///< Size of this structure in bytes
1917
1918 AddrColorFormat format; ///< Color buffer format
1919 AddrSurfaceNumber surfNum; ///< Surface number
1920 AddrSurfaceSwap surfSwap; ///< Surface swap
1921 ADDR_FLT_32 comps[4]; ///< Component values (r/g/b/a)
1922 } ELEM_FLT32TOCOLORPIXEL_INPUT;
1923
1924 /**
1925 ****************************************************************************************************
1926 * ELEM_FLT32TOCOLORPIXEL_INPUT
1927 *
1928 * @brief
1929 * Output structure for ElemFlt32ToColorPixel
1930 *
1931 ****************************************************************************************************
1932 */
1933 typedef struct _ELEM_FLT32TOCOLORPIXEL_OUTPUT
1934 {
1935 UINT_32 size; ///< Size of this structure in bytes
1936
1937 UINT_8* pPixel; ///< Real color value. Same data type as color buffer.
1938 /// Client must provide enough storage for this type.
1939 } ELEM_FLT32TOCOLORPIXEL_OUTPUT;
1940
1941 /**
1942 ****************************************************************************************************
1943 * ElemFlt32ToColorPixel
1944 *
1945 * @brief
1946 * Convert a FLT_32 value to a red/green/blue/alpha pixel value
1947 *
1948 * @return
1949 * Return code
1950 *
1951 ****************************************************************************************************
1952 */
1953 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToColorPixel(
1954 ADDR_HANDLE hLib,
1955 const ELEM_FLT32TOCOLORPIXEL_INPUT* pIn,
1956 ELEM_FLT32TOCOLORPIXEL_OUTPUT* pOut);
1957
1958
1959 /**
1960 ****************************************************************************************************
1961 * ADDR_CONVERT_TILEINFOTOHW_INPUT
1962 *
1963 * @brief
1964 * Input structure for AddrConvertTileInfoToHW
1965 * @note
1966 * When reverse is TRUE, indices are igonred
1967 ****************************************************************************************************
1968 */
1969 typedef struct _ADDR_CONVERT_TILEINFOTOHW_INPUT
1970 {
1971 UINT_32 size; ///< Size of this structure in bytes
1972 BOOL_32 reverse; ///< Convert control flag.
1973 /// FALSE: convert from real value to HW value;
1974 /// TRUE: convert from HW value to real value.
1975
1976 /// r800 and later HWL parameters
1977 ADDR_TILEINFO* pTileInfo; ///< Tile parameters with real value
1978
1979 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1980 /// while the global useTileIndex is set to 1
1981 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1982 ///< README: When tileIndex is not -1, this must be valid
1983 UINT_32 bpp; ///< Bits per pixel
1984 } ADDR_CONVERT_TILEINFOTOHW_INPUT;
1985
1986 /**
1987 ****************************************************************************************************
1988 * ADDR_CONVERT_TILEINFOTOHW_OUTPUT
1989 *
1990 * @brief
1991 * Output structure for AddrConvertTileInfoToHW
1992 ****************************************************************************************************
1993 */
1994 typedef struct _ADDR_CONVERT_TILEINFOTOHW_OUTPUT
1995 {
1996 UINT_32 size; ///< Size of this structure in bytes
1997
1998 /// r800 and later HWL parameters
1999 ADDR_TILEINFO* pTileInfo; ///< Tile parameters with hardware register value
2000
2001 } ADDR_CONVERT_TILEINFOTOHW_OUTPUT;
2002
2003 /**
2004 ****************************************************************************************************
2005 * AddrConvertTileInfoToHW
2006 *
2007 * @brief
2008 * Convert tile info from real value to hardware register value
2009 ****************************************************************************************************
2010 */
2011 ADDR_E_RETURNCODE ADDR_API AddrConvertTileInfoToHW(
2012 ADDR_HANDLE hLib,
2013 const ADDR_CONVERT_TILEINFOTOHW_INPUT* pIn,
2014 ADDR_CONVERT_TILEINFOTOHW_OUTPUT* pOut);
2015
2016
2017
2018 /**
2019 ****************************************************************************************************
2020 * ADDR_CONVERT_TILEINDEX_INPUT
2021 *
2022 * @brief
2023 * Input structure for AddrConvertTileIndex
2024 ****************************************************************************************************
2025 */
2026 typedef struct _ADDR_CONVERT_TILEINDEX_INPUT
2027 {
2028 UINT_32 size; ///< Size of this structure in bytes
2029
2030 INT_32 tileIndex; ///< Tile index
2031 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
2032 UINT_32 bpp; ///< Bits per pixel
2033 BOOL_32 tileInfoHw; ///< Set to TRUE if client wants HW enum, otherwise actual
2034 } ADDR_CONVERT_TILEINDEX_INPUT;
2035
2036 /**
2037 ****************************************************************************************************
2038 * ADDR_CONVERT_TILEINDEX_OUTPUT
2039 *
2040 * @brief
2041 * Output structure for AddrConvertTileIndex
2042 ****************************************************************************************************
2043 */
2044 typedef struct _ADDR_CONVERT_TILEINDEX_OUTPUT
2045 {
2046 UINT_32 size; ///< Size of this structure in bytes
2047
2048 AddrTileMode tileMode; ///< Tile mode
2049 AddrTileType tileType; ///< Tile type
2050 ADDR_TILEINFO* pTileInfo; ///< Tile info
2051
2052 } ADDR_CONVERT_TILEINDEX_OUTPUT;
2053
2054 /**
2055 ****************************************************************************************************
2056 * AddrConvertTileIndex
2057 *
2058 * @brief
2059 * Convert tile index to tile mode/type/info
2060 ****************************************************************************************************
2061 */
2062 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex(
2063 ADDR_HANDLE hLib,
2064 const ADDR_CONVERT_TILEINDEX_INPUT* pIn,
2065 ADDR_CONVERT_TILEINDEX_OUTPUT* pOut);
2066
2067 /**
2068 ****************************************************************************************************
2069 * ADDR_GET_MACROMODEINDEX_INPUT
2070 *
2071 * @brief
2072 * Input structure for AddrGetMacroModeIndex
2073 ****************************************************************************************************
2074 */
2075 typedef struct _ADDR_GET_MACROMODEINDEX_INPUT
2076 {
2077 UINT_32 size; ///< Size of this structure in bytes
2078 ADDR_SURFACE_FLAGS flags; ///< Surface flag
2079 INT_32 tileIndex; ///< Tile index
2080 UINT_32 bpp; ///< Bits per pixel
2081 UINT_32 numFrags; ///< Number of color fragments
2082 } ADDR_GET_MACROMODEINDEX_INPUT;
2083
2084 /**
2085 ****************************************************************************************************
2086 * ADDR_GET_MACROMODEINDEX_OUTPUT
2087 *
2088 * @brief
2089 * Output structure for AddrGetMacroModeIndex
2090 ****************************************************************************************************
2091 */
2092 typedef struct _ADDR_GET_MACROMODEINDEX_OUTPUT
2093 {
2094 UINT_32 size; ///< Size of this structure in bytes
2095 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
2096 } ADDR_GET_MACROMODEINDEX_OUTPUT;
2097
2098 /**
2099 ****************************************************************************************************
2100 * AddrGetMacroModeIndex
2101 *
2102 * @brief
2103 * Get macro mode index based on input parameters
2104 ****************************************************************************************************
2105 */
2106 ADDR_E_RETURNCODE ADDR_API AddrGetMacroModeIndex(
2107 ADDR_HANDLE hLib,
2108 const ADDR_GET_MACROMODEINDEX_INPUT* pIn,
2109 ADDR_GET_MACROMODEINDEX_OUTPUT* pOut);
2110
2111 /**
2112 ****************************************************************************************************
2113 * ADDR_CONVERT_TILEINDEX1_INPUT
2114 *
2115 * @brief
2116 * Input structure for AddrConvertTileIndex1 (without macro mode index)
2117 ****************************************************************************************************
2118 */
2119 typedef struct _ADDR_CONVERT_TILEINDEX1_INPUT
2120 {
2121 UINT_32 size; ///< Size of this structure in bytes
2122
2123 INT_32 tileIndex; ///< Tile index
2124 UINT_32 bpp; ///< Bits per pixel
2125 UINT_32 numSamples; ///< Number of samples
2126 BOOL_32 tileInfoHw; ///< Set to TRUE if client wants HW enum, otherwise actual
2127 } ADDR_CONVERT_TILEINDEX1_INPUT;
2128
2129 /**
2130 ****************************************************************************************************
2131 * AddrConvertTileIndex1
2132 *
2133 * @brief
2134 * Convert tile index to tile mode/type/info
2135 ****************************************************************************************************
2136 */
2137 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex1(
2138 ADDR_HANDLE hLib,
2139 const ADDR_CONVERT_TILEINDEX1_INPUT* pIn,
2140 ADDR_CONVERT_TILEINDEX_OUTPUT* pOut);
2141
2142
2143
2144 /**
2145 ****************************************************************************************************
2146 * ADDR_GET_TILEINDEX_INPUT
2147 *
2148 * @brief
2149 * Input structure for AddrGetTileIndex
2150 ****************************************************************************************************
2151 */
2152 typedef struct _ADDR_GET_TILEINDEX_INPUT
2153 {
2154 UINT_32 size; ///< Size of this structure in bytes
2155
2156 AddrTileMode tileMode; ///< Tile mode
2157 AddrTileType tileType; ///< Tile-type: disp/non-disp/...
2158 ADDR_TILEINFO* pTileInfo; ///< Pointer to tile-info structure, can be NULL for linear/1D
2159 } ADDR_GET_TILEINDEX_INPUT;
2160
2161 /**
2162 ****************************************************************************************************
2163 * ADDR_GET_TILEINDEX_OUTPUT
2164 *
2165 * @brief
2166 * Output structure for AddrGetTileIndex
2167 ****************************************************************************************************
2168 */
2169 typedef struct _ADDR_GET_TILEINDEX_OUTPUT
2170 {
2171 UINT_32 size; ///< Size of this structure in bytes
2172
2173 INT_32 index; ///< index in table
2174 } ADDR_GET_TILEINDEX_OUTPUT;
2175
2176 /**
2177 ****************************************************************************************************
2178 * AddrGetTileIndex
2179 *
2180 * @brief
2181 * Get the tiling mode index in table
2182 ****************************************************************************************************
2183 */
2184 ADDR_E_RETURNCODE ADDR_API AddrGetTileIndex(
2185 ADDR_HANDLE hLib,
2186 const ADDR_GET_TILEINDEX_INPUT* pIn,
2187 ADDR_GET_TILEINDEX_OUTPUT* pOut);
2188
2189
2190
2191 /**
2192 ****************************************************************************************************
2193 * ADDR_PRT_INFO_INPUT
2194 *
2195 * @brief
2196 * Input structure for AddrComputePrtInfo
2197 ****************************************************************************************************
2198 */
2199 typedef struct _ADDR_PRT_INFO_INPUT
2200 {
2201 AddrFormat format; ///< Surface format
2202 UINT_32 baseMipWidth; ///< Base mipmap width
2203 UINT_32 baseMipHeight; ///< Base mipmap height
2204 UINT_32 baseMipDepth; ///< Base mipmap depth
2205 UINT_32 numFrags; ///< Number of fragments,
2206 } ADDR_PRT_INFO_INPUT;
2207
2208 /**
2209 ****************************************************************************************************
2210 * ADDR_PRT_INFO_OUTPUT
2211 *
2212 * @brief
2213 * Input structure for AddrComputePrtInfo
2214 ****************************************************************************************************
2215 */
2216 typedef struct _ADDR_PRT_INFO_OUTPUT
2217 {
2218 UINT_32 prtTileWidth;
2219 UINT_32 prtTileHeight;
2220 } ADDR_PRT_INFO_OUTPUT;
2221
2222 /**
2223 ****************************************************************************************************
2224 * AddrComputePrtInfo
2225 *
2226 * @brief
2227 * Compute prt surface related information
2228 ****************************************************************************************************
2229 */
2230 ADDR_E_RETURNCODE ADDR_API AddrComputePrtInfo(
2231 ADDR_HANDLE hLib,
2232 const ADDR_PRT_INFO_INPUT* pIn,
2233 ADDR_PRT_INFO_OUTPUT* pOut);
2234
2235
2236
2237 ////////////////////////////////////////////////////////////////////////////////////////////////////
2238 // DCC key functions
2239 ////////////////////////////////////////////////////////////////////////////////////////////////////
2240
2241 /**
2242 ****************************************************************************************************
2243 * _ADDR_COMPUTE_DCCINFO_INPUT
2244 *
2245 * @brief
2246 * Input structure of AddrComputeDccInfo
2247 ****************************************************************************************************
2248 */
2249 typedef struct _ADDR_COMPUTE_DCCINFO_INPUT
2250 {
2251 UINT_32 size; ///< Size of this structure in bytes
2252 UINT_32 bpp; ///< BitPP of color surface
2253 UINT_32 numSamples; ///< Sample number of color surface
2254 UINT_64 colorSurfSize; ///< Size of color surface to which dcc key is bound
2255 AddrTileMode tileMode; ///< Tile mode of color surface
2256 ADDR_TILEINFO tileInfo; ///< Tile info of color surface
2257 UINT_32 tileSwizzle; ///< Tile swizzle
2258 INT_32 tileIndex; ///< Tile index of color surface,
2259 ///< MUST be -1 if you don't want to use it
2260 ///< while the global useTileIndex is set to 1
2261 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
2262 ///< README: When tileIndex is not -1, this must be valid
2263 } ADDR_COMPUTE_DCCINFO_INPUT;
2264
2265 /**
2266 ****************************************************************************************************
2267 * ADDR_COMPUTE_DCCINFO_OUTPUT
2268 *
2269 * @brief
2270 * Output structure of AddrComputeDccInfo
2271 ****************************************************************************************************
2272 */
2273 typedef struct _ADDR_COMPUTE_DCCINFO_OUTPUT
2274 {
2275 UINT_32 size; ///< Size of this structure in bytes
2276 UINT_64 dccRamBaseAlign; ///< Base alignment of dcc key
2277 UINT_64 dccRamSize; ///< Size of dcc key
2278 UINT_64 dccFastClearSize; ///< Size of dcc key portion that can be fast cleared
2279 BOOL_32 subLvlCompressible; ///< Whether sub resource is compressiable
2280 BOOL_32 dccRamSizeAligned; ///< Whether the dcc key size is aligned
2281 } ADDR_COMPUTE_DCCINFO_OUTPUT;
2282
2283 /**
2284 ****************************************************************************************************
2285 * AddrComputeDccInfo
2286 *
2287 * @brief
2288 * Compute DCC key size, base alignment
2289 * info
2290 ****************************************************************************************************
2291 */
2292 ADDR_E_RETURNCODE ADDR_API AddrComputeDccInfo(
2293 ADDR_HANDLE hLib,
2294 const ADDR_COMPUTE_DCCINFO_INPUT* pIn,
2295 ADDR_COMPUTE_DCCINFO_OUTPUT* pOut);
2296
2297
2298
2299 /**
2300 ****************************************************************************************************
2301 * ADDR_GET_MAX_ALIGNMENTS_OUTPUT
2302 *
2303 * @brief
2304 * Output structure of AddrGetMaxAlignments
2305 ****************************************************************************************************
2306 */
2307 typedef struct _ADDR_GET_MAX_ALIGNMENTS_OUTPUT
2308 {
2309 UINT_32 size; ///< Size of this structure in bytes
2310 UINT_64 baseAlign; ///< Maximum base alignment in bytes
2311 } ADDR_GET_MAX_ALIGNMENTS_OUTPUT;
2312
2313 /**
2314 ****************************************************************************************************
2315 * AddrGetMaxAlignments
2316 *
2317 * @brief
2318 * Gets maximnum alignments
2319 ****************************************************************************************************
2320 */
2321 ADDR_E_RETURNCODE ADDR_API AddrGetMaxAlignments(
2322 ADDR_HANDLE hLib,
2323 ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut);
2324
2325
2326
2327 /**
2328 ****************************************************************************************************
2329 * Address library interface version 2
2330 * available from Gfx9 hardware
2331 ****************************************************************************************************
2332 * Addr2ComputeSurfaceInfo()
2333 * Addr2ComputeSurfaceAddrFromCoord()
2334 * Addr2ComputeSurfaceCoordFromAddr()
2335
2336 * Addr2ComputeHtileInfo()
2337 * Addr2ComputeHtileAddrFromCoord()
2338 * Addr2ComputeHtileCoordFromAddr()
2339 *
2340 * Addr2ComputeCmaskInfo()
2341 * Addr2ComputeCmaskAddrFromCoord()
2342 * Addr2ComputeCmaskCoordFromAddr()
2343 *
2344 * Addr2ComputeFmaskInfo()
2345 * Addr2ComputeFmaskAddrFromCoord()
2346 * Addr2ComputeFmaskCoordFromAddr()
2347 *
2348 * Addr2ComputeDccInfo()
2349 *
2350 **/
2351
2352
2353 ////////////////////////////////////////////////////////////////////////////////////////////////////
2354 // Surface functions for Gfx9
2355 ////////////////////////////////////////////////////////////////////////////////////////////////////
2356
2357 /**
2358 ****************************************************************************************************
2359 * ADDR2_SURFACE_FLAGS
2360 *
2361 * @brief
2362 * Surface flags
2363 ****************************************************************************************************
2364 */
2365 typedef union _ADDR2_SURFACE_FLAGS
2366 {
2367 struct
2368 {
2369 UINT_32 color : 1; ///< This resource is a color buffer, can be used with RTV
2370 UINT_32 depth : 1; ///< Thie resource is a depth buffer, can be used with DSV
2371 UINT_32 stencil : 1; ///< Thie resource is a stencil buffer, can be used with DSV
2372 UINT_32 fmask : 1; ///< This is an fmask surface
2373 UINT_32 overlay : 1; ///< This is an overlay surface
2374 UINT_32 display : 1; ///< This resource is displable, can be used with DRV
2375 UINT_32 prt : 1; ///< This is a partially resident texture
2376 UINT_32 qbStereo : 1; ///< This is a quad buffer stereo surface
2377 UINT_32 interleaved : 1; ///< Special flag for interleaved YUV surface padding
2378 UINT_32 texture : 1; ///< This resource can be used with SRV
2379 UINT_32 unordered : 1; ///< This resource can be used with UAV
2380 UINT_32 rotated : 1; ///< This resource is rotated and displable
2381 UINT_32 needEquation : 1; ///< This resource needs equation to be generated if possible
2382 UINT_32 opt4space : 1; ///< This resource should be optimized for space
2383 UINT_32 minimizeAlign : 1; ///< This resource should use minimum alignment
2384 UINT_32 reserved : 17; ///< Reserved bits
2385 };
2386
2387 UINT_32 value;
2388 } ADDR2_SURFACE_FLAGS;
2389
2390 /**
2391 ****************************************************************************************************
2392 * ADDR2_COMPUTE_SURFACE_INFO_INPUT
2393 *
2394 * @brief
2395 * Input structure for Addr2ComputeSurfaceInfo
2396 ****************************************************************************************************
2397 */
2398 typedef struct _ADDR2_COMPUTE_SURFACE_INFO_INPUT
2399 {
2400 UINT_32 size; ///< Size of this structure in bytes
2401
2402 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
2403 AddrSwizzleMode swizzleMode; ///< Swizzle Mode for Gfx9
2404 AddrResourceType resourceType; ///< Surface type
2405 AddrFormat format; ///< Surface format
2406 UINT_32 bpp; ///< bits per pixel
2407 UINT_32 width; ///< Width (of mip0), in pixels
2408 UINT_32 height; ///< Height (of mip0), in pixels
2409 UINT_32 numSlices; ///< Number surface slice/depth (of mip0),
2410 UINT_32 numMipLevels; ///< Total mipmap levels.
2411 UINT_32 numSamples; ///< Number of samples
2412 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
2413 /// number of samples for normal AA; Set it to the
2414 /// number of fragments for EQAA
2415 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats)
2416 UINT_32 sliceAlign; ///< Required slice size in bytes
2417 } ADDR2_COMPUTE_SURFACE_INFO_INPUT;
2418
2419 /**
2420 ****************************************************************************************************
2421 * ADDR2_MIP_INFO
2422 *
2423 * @brief
2424 * Structure that contains information for mip level
2425 *
2426 ****************************************************************************************************
2427 */
2428 typedef struct _ADDR2_MIP_INFO
2429 {
2430 UINT_32 pitch; ///< Pitch in elements
2431 UINT_32 height; ///< Padded height in elements
2432 UINT_32 depth; ///< Padded depth
2433 UINT_32 pixelPitch; ///< Pitch in pixels
2434 UINT_32 pixelHeight; ///< Padded height in pixels
2435 UINT_32 equationIndex; ///< Equation index in the equation table
2436 UINT_64 offset; ///< Offset in bytes from mip base, should only be used
2437 ///< to setup vam surface descriptor, can't be used
2438 ///< to setup swizzle pattern
2439 UINT_64 macroBlockOffset; ///< macro block offset in bytes from mip base
2440 UINT_32 mipTailOffset; ///< mip tail offset in bytes
2441 UINT_32 mipTailCoordX; ///< mip tail coord x
2442 UINT_32 mipTailCoordY; ///< mip tail coord y
2443 UINT_32 mipTailCoordZ; ///< mip tail coord z
2444 } ADDR2_MIP_INFO;
2445
2446 /**
2447 ****************************************************************************************************
2448 * ADDR2_COMPUTE_SURFACE_INFO_OUTPUT
2449 *
2450 * @brief
2451 * Output structure for Addr2ComputeSurfInfo
2452 * @note
2453 Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
2454 Pixel: Original pixel
2455 ****************************************************************************************************
2456 */
2457 typedef struct _ADDR2_COMPUTE_SURFACE_INFO_OUTPUT
2458 {
2459 UINT_32 size; ///< Size of this structure in bytes
2460
2461 UINT_32 pitch; ///< Pitch in elements (blocks for compressed formats)
2462 UINT_32 height; ///< Padded height (of mip0) in elements
2463 UINT_32 numSlices; ///< Padded depth for 3d resource
2464 ///< or padded number of slices for 2d array resource
2465 UINT_32 mipChainPitch; ///< Pitch (of total mip chain) in elements
2466 UINT_32 mipChainHeight; ///< Padded height (of total mip chain) in elements
2467 UINT_32 mipChainSlice; ///< Padded depth (of total mip chain)
2468 UINT_64 sliceSize; ///< Slice (total mip chain) size in bytes
2469 UINT_64 surfSize; ///< Surface (total mip chain) size in bytes
2470 UINT_32 baseAlign; ///< Base address alignment
2471 UINT_32 bpp; ///< Bits per elements
2472 /// (e.g. blocks for BCn, 1/3 for 96bit)
2473 UINT_32 pixelMipChainPitch; ///< Mip chain pitch in original pixels
2474 UINT_32 pixelMipChainHeight; ///< Mip chain height in original pixels
2475 UINT_32 pixelPitch; ///< Pitch in original pixels
2476 UINT_32 pixelHeight; ///< Height in original pixels
2477 UINT_32 pixelBits; ///< Original bits per pixel, passed from input
2478
2479 UINT_32 blockWidth; ///< Width in element inside one block
2480 UINT_32 blockHeight; ///< Height in element inside one block
2481 UINT_32 blockSlices; ///< Slice number inside one block
2482 ///< Prt tile is one block, its width/height/slice
2483 ///< equals to blcok width/height/slice
2484
2485 BOOL_32 epitchIsHeight; ///< Whether to use height to program epitch register
2486 /// Stereo info
2487 ADDR_QBSTEREOINFO* pStereoInfo; ///< Stereo info, needed if qbStereo flag is TRUE
2488 /// Mip info
2489 ADDR2_MIP_INFO* pMipInfo; ///< Pointer to mip information array
2490 /// if it is not NULL, the array is assumed to
2491 /// contain numMipLevels entries
2492
2493 UINT_32 equationIndex; ///< Equation index in the equation table of mip0
2494 BOOL_32 mipChainInTail; ///< If whole mipchain falls into mip tail block
2495 UINT_32 firstMipIdInTail; ///< The id of first mip in tail, if there is no mip
2496 /// in tail, it will be set to number of mip levels
2497 } ADDR2_COMPUTE_SURFACE_INFO_OUTPUT;
2498
2499 /**
2500 ****************************************************************************************************
2501 * Addr2ComputeSurfaceInfo
2502 *
2503 * @brief
2504 * Compute surface width/height/slices/alignments and suitable tiling mode
2505 ****************************************************************************************************
2506 */
2507 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceInfo(
2508 ADDR_HANDLE hLib,
2509 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn,
2510 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut);
2511
2512
2513
2514 /**
2515 ****************************************************************************************************
2516 * ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
2517 *
2518 * @brief
2519 * Input structure for Addr2ComputeSurfaceAddrFromCoord
2520 ****************************************************************************************************
2521 */
2522 typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
2523 {
2524 UINT_32 size; ///< Size of this structure in bytes
2525
2526 UINT_32 x; ///< X coordinate
2527 UINT_32 y; ///< Y coordinate
2528 UINT_32 slice; ///< Slice index
2529 UINT_32 sample; ///< Sample index, use fragment index for EQAA
2530 UINT_32 mipId; ///< the mip ID in mip chain
2531
2532 AddrSwizzleMode swizzleMode; ///< Swizzle mode for Gfx9
2533 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
2534 AddrResourceType resourceType; ///< Surface type
2535 UINT_32 bpp; ///< Bits per pixel
2536 UINT_32 unalignedWidth; ///< Surface original width (of mip0)
2537 UINT_32 unalignedHeight; ///< Surface original height (of mip0)
2538 UINT_32 numSlices; ///< Surface original slices (of mip0)
2539 UINT_32 numMipLevels; ///< Total mipmap levels
2540 UINT_32 numSamples; ///< Number of samples
2541 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
2542 /// number of samples for normal AA; Set it to the
2543 /// number of fragments for EQAA
2544
2545 UINT_32 pipeBankXor; ///< Combined swizzle used to do bank/pipe rotation
2546 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats)
2547 } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
2548
2549 /**
2550 ****************************************************************************************************
2551 * ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
2552 *
2553 * @brief
2554 * Output structure for Addr2ComputeSurfaceAddrFromCoord
2555 ****************************************************************************************************
2556 */
2557 typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
2558 {
2559 UINT_32 size; ///< Size of this structure in bytes
2560
2561 UINT_64 addr; ///< Byte address
2562 UINT_32 bitPosition; ///< Bit position within surfaceAddr, 0-7.
2563 /// For surface bpp < 8, e.g. FMT_1.
2564 UINT_32 prtBlockIndex; ///< Index of a PRT tile (64K block)
2565 } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
2566
2567 /**
2568 ****************************************************************************************************
2569 * Addr2ComputeSurfaceAddrFromCoord
2570 *
2571 * @brief
2572 * Compute surface address from a given coordinate.
2573 ****************************************************************************************************
2574 */
2575 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceAddrFromCoord(
2576 ADDR_HANDLE hLib,
2577 const ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
2578 ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut);
2579
2580
2581
2582 /**
2583 ****************************************************************************************************
2584 * ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT
2585 *
2586 * @brief
2587 * Input structure for Addr2ComputeSurfaceCoordFromAddr
2588 ****************************************************************************************************
2589 */
2590 typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT
2591 {
2592 UINT_32 size; ///< Size of this structure in bytes
2593
2594 UINT_64 addr; ///< Address in bytes
2595 UINT_32 bitPosition; ///< Bit position in addr. 0-7. for surface bpp < 8,
2596 /// e.g. FMT_1;
2597
2598 AddrSwizzleMode swizzleMode; ///< Swizzle mode for Gfx9
2599 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
2600 AddrResourceType resourceType; ///< Surface type
2601 UINT_32 bpp; ///< Bits per pixel
2602 UINT_32 unalignedWidth; ///< Surface original width (of mip0)
2603 UINT_32 unalignedHeight; ///< Surface original height (of mip0)
2604 UINT_32 numSlices; ///< Surface original slices (of mip0)
2605 UINT_32 numMipLevels; ///< Total mipmap levels.
2606 UINT_32 numSamples; ///< Number of samples
2607 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
2608 /// number of samples for normal AA; Set it to the
2609 /// number of fragments for EQAA
2610
2611 UINT_32 pipeBankXor; ///< Combined swizzle used to do bank/pipe rotation
2612 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats)
2613 } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT;
2614
2615 /**
2616 ****************************************************************************************************
2617 * ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
2618 *
2619 * @brief
2620 * Output structure for Addr2ComputeSurfaceCoordFromAddr
2621 ****************************************************************************************************
2622 */
2623 typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
2624 {
2625 UINT_32 size; ///< Size of this structure in bytes
2626
2627 UINT_32 x; ///< X coordinate
2628 UINT_32 y; ///< Y coordinate
2629 UINT_32 slice; ///< Index of slices
2630 UINT_32 sample; ///< Index of samples, means fragment index for EQAA
2631 UINT_32 mipId; ///< mipmap level id
2632 } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT;
2633
2634 /**
2635 ****************************************************************************************************
2636 * Addr2ComputeSurfaceCoordFromAddr
2637 *
2638 * @brief
2639 * Compute coordinate from a given surface address
2640 ****************************************************************************************************
2641 */
2642 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceCoordFromAddr(
2643 ADDR_HANDLE hLib,
2644 const ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
2645 ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut);
2646
2647
2648
2649 ////////////////////////////////////////////////////////////////////////////////////////////////////
2650 // HTile functions for Gfx9
2651 ////////////////////////////////////////////////////////////////////////////////////////////////////
2652
2653 /**
2654 ****************************************************************************************************
2655 * ADDR2_META_FLAGS
2656 *
2657 * @brief
2658 * Metadata flags
2659 ****************************************************************************************************
2660 */
2661 typedef union _ADDR2_META_FLAGS
2662 {
2663 struct
2664 {
2665 UINT_32 pipeAligned : 1; ///< if Metadata being pipe aligned
2666 UINT_32 rbAligned : 1; ///< if Metadata being RB aligned
2667 UINT_32 linear : 1; ///< if Metadata linear, GFX9 does not suppord this!
2668 UINT_32 reserved : 29; ///< Reserved bits
2669 };
2670
2671 UINT_32 value;
2672 } ADDR2_META_FLAGS;
2673
2674 /**
2675 ****************************************************************************************************
2676 * ADDR2_META_MIP_INFO
2677 *
2678 * @brief
2679 * Structure to store per mip metadata information
2680 ****************************************************************************************************
2681 */
2682 typedef struct _ADDR2_META_MIP_INFO
2683 {
2684 BOOL_32 inMiptail;
2685 union
2686 {
2687 struct
2688 {
2689 UINT_32 startX;
2690 UINT_32 startY;
2691 UINT_32 startZ;
2692 UINT_32 width;
2693 UINT_32 height;
2694 UINT_32 depth;
2695 };
2696
2697 struct
2698 {
2699 UINT_32 offset;
2700 UINT_32 sliceSize;
2701 };
2702 };
2703 } ADDR2_META_MIP_INFO;
2704
2705 /**
2706 ****************************************************************************************************
2707 * ADDR2_COMPUTE_HTILE_INFO_INPUT
2708 *
2709 * @brief
2710 * Input structure of Addr2ComputeHtileInfo
2711 ****************************************************************************************************
2712 */
2713 typedef struct _ADDR2_COMPUTE_HTILE_INFO_INPUT
2714 {
2715 UINT_32 size; ///< Size of this structure in bytes
2716
2717 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags
2718 ADDR2_SURFACE_FLAGS depthFlags; ///< Depth surface flags
2719 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode
2720 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0)
2721 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0)
2722 UINT_32 numSlices; ///< Number of slices of depth surface (of mip0)
2723 UINT_32 numMipLevels; ///< Total mipmap levels of color surface
2724 UINT_32 firstMipIdInTail;
2725 } ADDR2_COMPUTE_HTILE_INFO_INPUT;
2726
2727 /**
2728 ****************************************************************************************************
2729 * ADDR2_COMPUTE_HTILE_INFO_OUTPUT
2730 *
2731 * @brief
2732 * Output structure of Addr2ComputeHtileInfo
2733 ****************************************************************************************************
2734 */
2735 typedef struct _ADDR2_COMPUTE_HTILE_INFO_OUTPUT
2736 {
2737 UINT_32 size; ///< Size of this structure in bytes
2738
2739 UINT_32 pitch; ///< Pitch in pixels of depth buffer represented in this
2740 /// HTile buffer. This might be larger than original depth
2741 /// buffer pitch when called with an unaligned pitch.
2742 UINT_32 height; ///< Height in pixels, as above
2743 UINT_32 baseAlign; ///< Base alignment
2744 UINT_32 sliceSize; ///< Slice size, in bytes.
2745 UINT_32 htileBytes; ///< Size of HTILE buffer, in bytes
2746 UINT_32 metaBlkWidth; ///< Meta block width
2747 UINT_32 metaBlkHeight; ///< Meta block height
2748 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice
2749
2750 ADDR2_META_MIP_INFO* pMipInfo; ///< HTILE mip information
2751 } ADDR2_COMPUTE_HTILE_INFO_OUTPUT;
2752
2753 /**
2754 ****************************************************************************************************
2755 * Addr2ComputeHtileInfo
2756 *
2757 * @brief
2758 * Compute Htile pitch, height, base alignment and size in bytes
2759 ****************************************************************************************************
2760 */
2761 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileInfo(
2762 ADDR_HANDLE hLib,
2763 const ADDR2_COMPUTE_HTILE_INFO_INPUT* pIn,
2764 ADDR2_COMPUTE_HTILE_INFO_OUTPUT* pOut);
2765
2766
2767
2768 /**
2769 ****************************************************************************************************
2770 * ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
2771 *
2772 * @brief
2773 * Input structure for Addr2ComputeHtileAddrFromCoord
2774 ****************************************************************************************************
2775 */
2776 typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
2777 {
2778 UINT_32 size; ///< Size of this structure in bytes
2779
2780 UINT_32 x; ///< X coordinate
2781 UINT_32 y; ///< Y coordinate
2782 UINT_32 slice; ///< Index of slices
2783 UINT_32 mipId; ///< mipmap level id
2784
2785 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags
2786 ADDR2_SURFACE_FLAGS depthflags; ///< Depth surface flags
2787 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode
2788 UINT_32 bpp; ///< Depth surface bits per pixel
2789 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0)
2790 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0)
2791 UINT_32 numSlices; ///< Depth surface original depth (of mip0)
2792 UINT_32 numMipLevels; ///< Depth surface total mipmap levels
2793 UINT_32 numSamples; ///< Depth surface number of samples
2794 UINT_32 pipeXor; ///< Pipe xor setting
2795 } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT;
2796
2797 /**
2798 ****************************************************************************************************
2799 * ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
2800 *
2801 * @brief
2802 * Output structure for Addr2ComputeHtileAddrFromCoord
2803 ****************************************************************************************************
2804 */
2805 typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
2806 {
2807 UINT_32 size; ///< Size of this structure in bytes
2808
2809 UINT_64 addr; ///< Address in bytes
2810 } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT;
2811
2812 /**
2813 ****************************************************************************************************
2814 * Addr2ComputeHtileAddrFromCoord
2815 *
2816 * @brief
2817 * Compute Htile address according to coordinates (of depth buffer)
2818 ****************************************************************************************************
2819 */
2820 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileAddrFromCoord(
2821 ADDR_HANDLE hLib,
2822 const ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn,
2823 ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut);
2824
2825
2826
2827 /**
2828 ****************************************************************************************************
2829 * ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT
2830 *
2831 * @brief
2832 * Input structure for Addr2ComputeHtileCoordFromAddr
2833 ****************************************************************************************************
2834 */
2835 typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT
2836 {
2837 UINT_32 size; ///< Size of this structure in bytes
2838
2839 UINT_64 addr; ///< Address
2840
2841 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags
2842 ADDR2_SURFACE_FLAGS depthFlags; ///< Depth surface flags
2843 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode
2844 UINT_32 bpp; ///< Depth surface bits per pixel
2845 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0)
2846 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0)
2847 UINT_32 numSlices; ///< Depth surface original depth (of mip0)
2848 UINT_32 numMipLevels; ///< Depth surface total mipmap levels
2849 UINT_32 numSamples; ///< Depth surface number of samples
2850 UINT_32 pipeXor; ///< Pipe xor setting
2851 } ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT;
2852
2853 /**
2854 ****************************************************************************************************
2855 * ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
2856 *
2857 * @brief
2858 * Output structure for Addr2ComputeHtileCoordFromAddr
2859 ****************************************************************************************************
2860 */
2861 typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
2862 {
2863 UINT_32 size; ///< Size of this structure in bytes
2864
2865 UINT_32 x; ///< X coordinate
2866 UINT_32 y; ///< Y coordinate
2867 UINT_32 slice; ///< Index of slices
2868 UINT_32 mipId; ///< mipmap level id
2869 } ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT;
2870
2871 /**
2872 ****************************************************************************************************
2873 * Addr2ComputeHtileCoordFromAddr
2874 *
2875 * @brief
2876 * Compute coordinates within depth buffer (1st pixel of a micro tile) according to
2877 * Htile address
2878 ****************************************************************************************************
2879 */
2880 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileCoordFromAddr(
2881 ADDR_HANDLE hLib,
2882 const ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn,
2883 ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut);
2884
2885
2886
2887 ////////////////////////////////////////////////////////////////////////////////////////////////////
2888 // C-mask functions for Gfx9
2889 ////////////////////////////////////////////////////////////////////////////////////////////////////
2890
2891 /**
2892 ****************************************************************************************************
2893 * ADDR2_COMPUTE_CMASK_INFO_INPUT
2894 *
2895 * @brief
2896 * Input structure of Addr2ComputeCmaskInfo
2897 ****************************************************************************************************
2898 */
2899 typedef struct _ADDR2_COMPUTE_CMASKINFO_INPUT
2900 {
2901 UINT_32 size; ///< Size of this structure in bytes
2902
2903 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags
2904 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags
2905 AddrResourceType resourceType; ///< Color surface type
2906 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
2907 UINT_32 unalignedWidth; ///< Color surface original width
2908 UINT_32 unalignedHeight; ///< Color surface original height
2909 UINT_32 numSlices; ///< Number of slices of color buffer
2910 } ADDR2_COMPUTE_CMASK_INFO_INPUT;
2911
2912 /**
2913 ****************************************************************************************************
2914 * ADDR2_COMPUTE_CMASK_INFO_OUTPUT
2915 *
2916 * @brief
2917 * Output structure of Addr2ComputeCmaskInfo
2918 ****************************************************************************************************
2919 */
2920 typedef struct _ADDR2_COMPUTE_CMASK_INFO_OUTPUT
2921 {
2922 UINT_32 size; ///< Size of this structure in bytes
2923
2924 UINT_32 pitch; ///< Pitch in pixels of color buffer which
2925 /// this Cmask matches. The size might be larger than
2926 /// original color buffer pitch when called with
2927 /// an unaligned pitch.
2928 UINT_32 height; ///< Height in pixels, as above
2929 UINT_32 baseAlign; ///< Base alignment
2930 UINT_32 sliceSize; ///< Slice size, in bytes.
2931 UINT_32 cmaskBytes; ///< Size in bytes of CMask buffer
2932 UINT_32 metaBlkWidth; ///< Meta block width
2933 UINT_32 metaBlkHeight; ///< Meta block height
2934
2935 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice
2936 } ADDR2_COMPUTE_CMASK_INFO_OUTPUT;
2937
2938 /**
2939 ****************************************************************************************************
2940 * Addr2ComputeCmaskInfo
2941 *
2942 * @brief
2943 * Compute Cmask pitch, height, base alignment and size in bytes from color buffer
2944 * info
2945 ****************************************************************************************************
2946 */
2947 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskInfo(
2948 ADDR_HANDLE hLib,
2949 const ADDR2_COMPUTE_CMASK_INFO_INPUT* pIn,
2950 ADDR2_COMPUTE_CMASK_INFO_OUTPUT* pOut);
2951
2952
2953
2954 /**
2955 ****************************************************************************************************
2956 * ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
2957 *
2958 * @brief
2959 * Input structure for Addr2ComputeCmaskAddrFromCoord
2960 *
2961 ****************************************************************************************************
2962 */
2963 typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
2964 {
2965 UINT_32 size; ///< Size of this structure in bytes
2966
2967 UINT_32 x; ///< X coordinate
2968 UINT_32 y; ///< Y coordinate
2969 UINT_32 slice; ///< Index of slices
2970
2971 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags
2972 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags
2973 AddrResourceType resourceType; ///< Color surface type
2974 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
2975
2976 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
2977 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
2978 UINT_32 numSlices; ///< Color surface original slices (of mip0)
2979
2980 UINT_32 numSamples; ///< Color surfae sample number
2981 UINT_32 numFrags; ///< Color surface fragment number
2982
2983 UINT_32 pipeXor; ///< pipe Xor setting
2984 } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT;
2985
2986 /**
2987 ****************************************************************************************************
2988 * ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
2989 *
2990 * @brief
2991 * Output structure for Addr2ComputeCmaskAddrFromCoord
2992 ****************************************************************************************************
2993 */
2994 typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
2995 {
2996 UINT_32 size; ///< Size of this structure in bytes
2997
2998 UINT_64 addr; ///< CMASK address in bytes
2999 UINT_32 bitPosition; ///< Bit position within addr, 0 or 4
3000 } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT;
3001
3002 /**
3003 ****************************************************************************************************
3004 * Addr2ComputeCmaskAddrFromCoord
3005 *
3006 * @brief
3007 * Compute Cmask address according to coordinates (of MSAA color buffer)
3008 ****************************************************************************************************
3009 */
3010 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskAddrFromCoord(
3011 ADDR_HANDLE hLib,
3012 const ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn,
3013 ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut);
3014
3015
3016
3017 /**
3018 ****************************************************************************************************
3019 * ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT
3020 *
3021 * @brief
3022 * Input structure for Addr2ComputeCmaskCoordFromAddr
3023 ****************************************************************************************************
3024 */
3025 typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT
3026 {
3027 UINT_32 size; ///< Size of this structure in bytes
3028
3029 UINT_64 addr; ///< CMASK address in bytes
3030 UINT_32 bitPosition; ///< Bit position within addr, 0 or 4
3031
3032 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags
3033 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags
3034 AddrResourceType resourceType; ///< Color surface type
3035 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3036
3037 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
3038 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
3039 UINT_32 numSlices; ///< Color surface original slices (of mip0)
3040 UINT_32 numMipLevels; ///< Color surface total mipmap levels.
3041 } ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT;
3042
3043 /**
3044 ****************************************************************************************************
3045 * ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
3046 *
3047 * @brief
3048 * Output structure for Addr2ComputeCmaskCoordFromAddr
3049 ****************************************************************************************************
3050 */
3051 typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
3052 {
3053 UINT_32 size; ///< Size of this structure in bytes
3054
3055 UINT_32 x; ///< X coordinate
3056 UINT_32 y; ///< Y coordinate
3057 UINT_32 slice; ///< Index of slices
3058 UINT_32 mipId; ///< mipmap level id
3059 } ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT;
3060
3061 /**
3062 ****************************************************************************************************
3063 * Addr2ComputeCmaskCoordFromAddr
3064 *
3065 * @brief
3066 * Compute coordinates within color buffer (1st pixel of a micro tile) according to
3067 * Cmask address
3068 ****************************************************************************************************
3069 */
3070 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskCoordFromAddr(
3071 ADDR_HANDLE hLib,
3072 const ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT* pIn,
3073 ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT* pOut);
3074
3075
3076
3077 ////////////////////////////////////////////////////////////////////////////////////////////////////
3078 // F-mask functions for Gfx9
3079 ////////////////////////////////////////////////////////////////////////////////////////////////////
3080
3081 /**
3082 ****************************************************************************************************
3083 * ADDR2_FMASK_FLAGS
3084 *
3085 * @brief
3086 * FMASK flags
3087 ****************************************************************************************************
3088 */
3089 typedef union _ADDR2_FMASK_FLAGS
3090 {
3091 struct
3092 {
3093 UINT_32 resolved : 1; ///< TRUE if this is a resolved fmask, used by H/W clients
3094 /// by H/W clients. S/W should always set it to FALSE.
3095 UINT_32 reserved : 31; ///< Reserved for future use.
3096 };
3097
3098 UINT_32 value;
3099 } ADDR2_FMASK_FLAGS;
3100
3101 /**
3102 ****************************************************************************************************
3103 * ADDR2_COMPUTE_FMASK_INFO_INPUT
3104 *
3105 * @brief
3106 * Input structure for Addr2ComputeFmaskInfo
3107 ****************************************************************************************************
3108 */
3109 typedef struct _ADDR2_COMPUTE_FMASK_INFO_INPUT
3110 {
3111 UINT_32 size; ///< Size of this structure in bytes
3112
3113 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3114 UINT_32 unalignedWidth; ///< Color surface original width
3115 UINT_32 unalignedHeight; ///< Color surface original height
3116 UINT_32 numSlices; ///< Number of slices/depth
3117 UINT_32 numSamples; ///< Number of samples
3118 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3119 /// number of samples for normal AA; Set it to the
3120 /// number of fragments for EQAA
3121 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags
3122 } ADDR2_COMPUTE_FMASK_INFO_INPUT;
3123
3124 /**
3125 ****************************************************************************************************
3126 * ADDR2_COMPUTE_FMASK_INFO_OUTPUT
3127 *
3128 * @brief
3129 * Output structure for Addr2ComputeFmaskInfo
3130 ****************************************************************************************************
3131 */
3132 typedef struct _ADDR2_COMPUTE_FMASK_INFO_OUTPUT
3133 {
3134 UINT_32 size; ///< Size of this structure in bytes
3135
3136 UINT_32 pitch; ///< Pitch of fmask in pixels
3137 UINT_32 height; ///< Height of fmask in pixels
3138 UINT_32 baseAlign; ///< Base alignment
3139 UINT_32 numSlices; ///< Slices of fmask
3140 UINT_32 fmaskBytes; ///< Size of fmask in bytes
3141 UINT_32 bpp; ///< Bits per pixel of FMASK is: number of bit planes
3142 UINT_32 numSamples; ///< Number of samples
3143 UINT_32 sliceSize; ///< Size of slice in bytes
3144 } ADDR2_COMPUTE_FMASK_INFO_OUTPUT;
3145
3146 /**
3147 ****************************************************************************************************
3148 * Addr2ComputeFmaskInfo
3149 *
3150 * @brief
3151 * Compute Fmask pitch/height/slices/alignments and size in bytes
3152 ****************************************************************************************************
3153 */
3154 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskInfo(
3155 ADDR_HANDLE hLib,
3156 const ADDR2_COMPUTE_FMASK_INFO_INPUT* pIn,
3157 ADDR2_COMPUTE_FMASK_INFO_OUTPUT* pOut);
3158
3159
3160
3161 /**
3162 ****************************************************************************************************
3163 * ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
3164 *
3165 * @brief
3166 * Input structure for Addr2ComputeFmaskAddrFromCoord
3167 ****************************************************************************************************
3168 */
3169 typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
3170 {
3171 UINT_32 size; ///< Size of this structure in bytes
3172
3173 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3174 UINT_32 x; ///< X coordinate
3175 UINT_32 y; ///< Y coordinate
3176 UINT_32 slice; ///< Slice index
3177 UINT_32 sample; ///< Sample index (fragment index for EQAA)
3178 UINT_32 plane; ///< Plane number
3179
3180 UINT_32 unalignedWidth; ///< Color surface original width
3181 UINT_32 unalignedHeight; ///< Color surface original height
3182 UINT_32 numSamples; ///< Number of samples
3183 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3184 /// number of samples for normal AA; Set it to the
3185 /// number of fragments for EQAA
3186 UINT_32 tileSwizzle; ///< Combined swizzle used to do bank/pipe rotation
3187
3188 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags
3189 } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT;
3190
3191 /**
3192 ****************************************************************************************************
3193 * ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
3194 *
3195 * @brief
3196 * Output structure for Addr2ComputeFmaskAddrFromCoord
3197 ****************************************************************************************************
3198 */
3199 typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
3200 {
3201 UINT_32 size; ///< Size of this structure in bytes
3202
3203 UINT_64 addr; ///< Fmask address
3204 UINT_32 bitPosition; ///< Bit position within fmaskAddr, 0-7.
3205 } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT;
3206
3207 /**
3208 ****************************************************************************************************
3209 * Addr2ComputeFmaskAddrFromCoord
3210 *
3211 * @brief
3212 * Compute Fmask address according to coordinates (x,y,slice,sample,plane)
3213 ****************************************************************************************************
3214 */
3215 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskAddrFromCoord(
3216 ADDR_HANDLE hLib,
3217 const ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn,
3218 ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut);
3219
3220
3221
3222 /**
3223 ****************************************************************************************************
3224 * ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT
3225 *
3226 * @brief
3227 * Input structure for Addr2ComputeFmaskCoordFromAddr
3228 ****************************************************************************************************
3229 */
3230 typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT
3231 {
3232 UINT_32 size; ///< Size of this structure in bytes
3233
3234 UINT_64 addr; ///< Address
3235 UINT_32 bitPosition; ///< Bit position within addr, 0-7.
3236 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3237
3238 UINT_32 unalignedWidth; ///< Color surface original width
3239 UINT_32 unalignedHeight; ///< Color surface original height
3240 UINT_32 numSamples; ///< Number of samples
3241 UINT_32 numFrags; ///< Number of fragments
3242
3243 UINT_32 tileSwizzle; ///< Combined swizzle used to do bank/pipe rotation
3244
3245 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags
3246 } ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT;
3247
3248 /**
3249 ****************************************************************************************************
3250 * ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
3251 *
3252 * @brief
3253 * Output structure for Addr2ComputeFmaskCoordFromAddr
3254 ****************************************************************************************************
3255 */
3256 typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
3257 {
3258 UINT_32 size; ///< Size of this structure in bytes
3259
3260 UINT_32 x; ///< X coordinate
3261 UINT_32 y; ///< Y coordinate
3262 UINT_32 slice; ///< Slice index
3263 UINT_32 sample; ///< Sample index (fragment index for EQAA)
3264 UINT_32 plane; ///< Plane number
3265 } ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT;
3266
3267 /**
3268 ****************************************************************************************************
3269 * Addr2ComputeFmaskCoordFromAddr
3270 *
3271 * @brief
3272 * Compute FMASK coordinate from an given address
3273 ****************************************************************************************************
3274 */
3275 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskCoordFromAddr(
3276 ADDR_HANDLE hLib,
3277 const ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn,
3278 ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut);
3279
3280
3281
3282 ////////////////////////////////////////////////////////////////////////////////////////////////////
3283 // DCC key functions for Gfx9
3284 ////////////////////////////////////////////////////////////////////////////////////////////////////
3285
3286 /**
3287 ****************************************************************************************************
3288 * _ADDR2_COMPUTE_DCCINFO_INPUT
3289 *
3290 * @brief
3291 * Input structure of Addr2ComputeDccInfo
3292 ****************************************************************************************************
3293 */
3294 typedef struct _ADDR2_COMPUTE_DCCINFO_INPUT
3295 {
3296 UINT_32 size; ///< Size of this structure in bytes
3297
3298 ADDR2_META_FLAGS dccKeyFlags; ///< DCC key flags
3299 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags
3300 AddrResourceType resourceType; ///< Color surface type
3301 AddrSwizzleMode swizzleMode; ///< Color surface swizzle mode
3302 UINT_32 bpp; ///< bits per pixel
3303 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
3304 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
3305 UINT_32 numSlices; ///< Number of slices, of color surface (of mip0)
3306 UINT_32 numFrags; ///< Fragment number of color surface
3307 UINT_32 numMipLevels; ///< Total mipmap levels of color surface
3308 UINT_32 dataSurfaceSize; ///< The padded size of all slices and mip levels
3309 ///< useful in meta linear case
3310 UINT_32 firstMipIdInTail;
3311 } ADDR2_COMPUTE_DCCINFO_INPUT;
3312
3313 /**
3314 ****************************************************************************************************
3315 * ADDR2_COMPUTE_DCCINFO_OUTPUT
3316 *
3317 * @brief
3318 * Output structure of Addr2ComputeDccInfo
3319 ****************************************************************************************************
3320 */
3321 typedef struct _ADDR2_COMPUTE_DCCINFO_OUTPUT
3322 {
3323 UINT_32 size; ///< Size of this structure in bytes
3324
3325 UINT_32 dccRamBaseAlign; ///< Base alignment of dcc key
3326 UINT_32 dccRamSize; ///< Size of dcc key
3327
3328 UINT_32 pitch; ///< DCC surface mip chain pitch
3329 UINT_32 height; ///< DCC surface mip chain height
3330 UINT_32 depth; ///< DCC surface mip chain depth
3331
3332 UINT_32 compressBlkWidth; ///< DCC compress block width
3333 UINT_32 compressBlkHeight; ///< DCC compress block height
3334 UINT_32 compressBlkDepth; ///< DCC compress block depth
3335
3336 UINT_32 metaBlkWidth; ///< DCC meta block width
3337 UINT_32 metaBlkHeight; ///< DCC meta block height
3338 UINT_32 metaBlkDepth; ///< DCC meta block depth
3339
3340 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice
3341
3342 union
3343 {
3344 UINT_32 fastClearSizePerSlice; ///< Size of DCC within a slice should be fast cleared
3345 UINT_32 dccRamSliceSize;
3346 };
3347
3348 ADDR2_META_MIP_INFO* pMipInfo; ///< DCC mip information
3349 } ADDR2_COMPUTE_DCCINFO_OUTPUT;
3350
3351 /**
3352 ****************************************************************************************************
3353 * Addr2ComputeDccInfo
3354 *
3355 * @brief
3356 * Compute DCC key size, base alignment
3357 * info
3358 ****************************************************************************************************
3359 */
3360 ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccInfo(
3361 ADDR_HANDLE hLib,
3362 const ADDR2_COMPUTE_DCCINFO_INPUT* pIn,
3363 ADDR2_COMPUTE_DCCINFO_OUTPUT* pOut);
3364
3365
3366 /**
3367 ****************************************************************************************************
3368 * ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
3369 *
3370 * @brief
3371 * Input structure for Addr2ComputeDccAddrFromCoord
3372 *
3373 ****************************************************************************************************
3374 */
3375 typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
3376 {
3377 UINT_32 size; ///< Size of this structure in bytes
3378
3379 UINT_32 x; ///< X coordinate
3380 UINT_32 y; ///< Y coordinate
3381 UINT_32 slice; ///< Index of slices
3382 UINT_32 sample; ///< Index of samples, means fragment index for EQAA
3383 UINT_32 mipId; ///< mipmap level id
3384
3385 ADDR2_META_FLAGS dccKeyFlags; ///< DCC flags
3386 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags
3387 AddrResourceType resourceType; ///< Color surface type
3388 AddrSwizzleMode swizzleMode; ///< Color surface swizzle mode
3389 UINT_32 bpp; ///< Color surface bits per pixel
3390 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
3391 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
3392 UINT_32 numSlices; ///< Color surface original slices (of mip0)
3393 UINT_32 numMipLevels; ///< Color surface mipmap levels
3394 UINT_32 numFrags; ///< Color surface fragment number
3395
3396 UINT_32 pipeXor; ///< pipe Xor setting
3397 } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT;
3398
3399 /**
3400 ****************************************************************************************************
3401 * ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT
3402 *
3403 * @brief
3404 * Output structure for Addr2ComputeDccAddrFromCoord
3405 ****************************************************************************************************
3406 */
3407 typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT
3408 {
3409 UINT_32 size; ///< Size of this structure in bytes
3410
3411 UINT_64 addr; ///< DCC address in bytes
3412 } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT;
3413
3414 /**
3415 ****************************************************************************************************
3416 * Addr2ComputeDccAddrFromCoord
3417 *
3418 * @brief
3419 * Compute DCC address according to coordinates (of MSAA color buffer)
3420 ****************************************************************************************************
3421 */
3422 ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccAddrFromCoord(
3423 ADDR_HANDLE hLib,
3424 const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT* pIn,
3425 ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT* pOut);
3426
3427 ////////////////////////////////////////////////////////////////////////////////////////////////////
3428 // Misc functions for Gfx9
3429 ////////////////////////////////////////////////////////////////////////////////////////////////////
3430
3431 /**
3432 ****************************************************************************************************
3433 * ADDR2_COMPUTE_PIPEBANKXOR_INPUT
3434 *
3435 * @brief
3436 * Input structure of Addr2ComputePipebankXor
3437 ****************************************************************************************************
3438 */
3439 typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_INPUT
3440 {
3441 UINT_32 size; ///< Size of this structure in bytes
3442 UINT_32 surfIndex; ///< Input surface index
3443 ADDR2_SURFACE_FLAGS flags; ///< Surface flag
3444 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode
3445 AddrResourceType resourceType; ///< Surface resource type
3446 AddrFormat format; ///< Surface format
3447 UINT_32 numSamples; ///< Number of samples
3448 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3449 /// number of samples for normal AA; Set it to the
3450 /// number of fragments for EQAA
3451 } ADDR2_COMPUTE_PIPEBANKXOR_INPUT;
3452
3453 /**
3454 ****************************************************************************************************
3455 * ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT
3456 *
3457 * @brief
3458 * Output structure of Addr2ComputePipebankXor
3459 ****************************************************************************************************
3460 */
3461 typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT
3462 {
3463 UINT_32 size; ///< Size of this structure in bytes
3464 UINT_32 pipeBankXor; ///< Pipe bank xor
3465 } ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT;
3466
3467 /**
3468 ****************************************************************************************************
3469 * Addr2ComputePipeBankXor
3470 *
3471 * @brief
3472 * Calculate a valid bank pipe xor value for client to use.
3473 ****************************************************************************************************
3474 */
3475 ADDR_E_RETURNCODE ADDR_API Addr2ComputePipeBankXor(
3476 ADDR_HANDLE hLib,
3477 const ADDR2_COMPUTE_PIPEBANKXOR_INPUT* pIn,
3478 ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT* pOut);
3479
3480 /**
3481 ****************************************************************************************************
3482 * ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT
3483 *
3484 * @brief
3485 * Input structure of Addr2ComputeSlicePipeBankXor
3486 ****************************************************************************************************
3487 */
3488 typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT
3489 {
3490 UINT_32 size; ///< Size of this structure in bytes
3491 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode
3492 AddrResourceType resourceType; ///< Surface resource type
3493 UINT_32 basePipeBankXor; ///< Base pipe bank xor
3494 UINT_32 slice; ///< Slice id
3495 UINT_32 numSamples; ///< Number of samples
3496 } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT;
3497
3498 /**
3499 ****************************************************************************************************
3500 * ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
3501 *
3502 * @brief
3503 * Output structure of Addr2ComputeSlicePipeBankXor
3504 ****************************************************************************************************
3505 */
3506 typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
3507 {
3508 UINT_32 size; ///< Size of this structure in bytes
3509 UINT_32 pipeBankXor; ///< Pipe bank xor
3510 } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT;
3511
3512 /**
3513 ****************************************************************************************************
3514 * Addr2ComputeSlicePipeBankXor
3515 *
3516 * @brief
3517 * Calculate slice pipe bank xor value based on base pipe bank xor and slice id.
3518 ****************************************************************************************************
3519 */
3520 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSlicePipeBankXor(
3521 ADDR_HANDLE hLib,
3522 const ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn,
3523 ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT* pOut);
3524
3525 /**
3526 ****************************************************************************************************
3527 * ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
3528 *
3529 * @brief
3530 * Input structure of Addr2ComputeSubResourceOffsetForSwizzlePattern
3531 ****************************************************************************************************
3532 */
3533 typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
3534 {
3535 UINT_32 size; ///< Size of this structure in bytes
3536 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode
3537 AddrResourceType resourceType; ///< Surface resource type
3538 UINT_32 pipeBankXor; ///< Per resource xor
3539 UINT_32 slice; ///< Slice id
3540 UINT_64 sliceSize; ///< Slice size of a mip chain
3541 UINT_64 macroBlockOffset; ///< Macro block offset, returned in ADDR2_MIP_INFO
3542 UINT_32 mipTailOffset; ///< Mip tail offset, returned in ADDR2_MIP_INFO
3543 } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT;
3544
3545 /**
3546 ****************************************************************************************************
3547 * ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
3548 *
3549 * @brief
3550 * Output structure of Addr2ComputeSubResourceOffsetForSwizzlePattern
3551 ****************************************************************************************************
3552 */
3553 typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
3554 {
3555 UINT_32 size; ///< Size of this structure in bytes
3556 UINT_64 offset; ///< offset
3557 } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT;
3558
3559 /**
3560 ****************************************************************************************************
3561 * Addr2ComputeSubResourceOffsetForSwizzlePattern
3562 *
3563 * @brief
3564 * Calculate sub resource offset to support swizzle pattern.
3565 ****************************************************************************************************
3566 */
3567 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSubResourceOffsetForSwizzlePattern(
3568 ADDR_HANDLE hLib,
3569 const ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn,
3570 ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT* pOut);
3571
3572 /**
3573 ****************************************************************************************************
3574 * ADDR2_BLOCK_SET
3575 *
3576 * @brief
3577 * Bit field that defines block type
3578 ****************************************************************************************************
3579 */
3580 typedef union _ADDR2_BLOCK_SET
3581 {
3582 struct
3583 {
3584 UINT_32 micro : 1; // 256B block for 2D resource
3585 UINT_32 macro4KB : 1; // 4KB for 2D/3D resource
3586 UINT_32 macro64KB : 1; // 64KB for 2D/3D resource
3587 UINT_32 var : 1; // VAR block
3588 UINT_32 linear : 1; // Linear block
3589 UINT_32 reserved : 27;
3590 };
3591
3592 UINT_32 value;
3593 } ADDR2_BLOCK_SET;
3594
3595 /**
3596 ****************************************************************************************************
3597 * ADDR2_SWTYPE_SET
3598 *
3599 * @brief
3600 * Bit field that defines swizzle type
3601 ****************************************************************************************************
3602 */
3603 typedef union _ADDR2_SWTYPE_SET
3604 {
3605 struct
3606 {
3607 UINT_32 sw_Z : 1; // SW_*_Z_*
3608 UINT_32 sw_S : 1; // SW_*_S_*
3609 UINT_32 sw_D : 1; // SW_*_D_*
3610 UINT_32 sw_R : 1; // SW_*_R_*
3611 UINT_32 reserved : 28;
3612 };
3613
3614 UINT_32 value;
3615 } ADDR2_SWTYPE_SET;
3616
3617 /**
3618 ****************************************************************************************************
3619 * ADDR2_GET_PREFERRED_SURF_SETTING_INPUT
3620 *
3621 * @brief
3622 * Input structure of Addr2GetPreferredSurfaceSetting
3623 ****************************************************************************************************
3624 */
3625 typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_INPUT
3626 {
3627 UINT_32 size; ///< Size of this structure in bytes
3628
3629 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
3630 AddrResourceType resourceType; ///< Surface type
3631 AddrFormat format; ///< Surface format
3632 AddrResrouceLocation resourceLoction; ///< Surface heap choice
3633 ADDR2_BLOCK_SET forbiddenBlock; ///< Client can use it to disable some block setting
3634 ///< such as linear for DXTn, tiled for YUV
3635 ADDR2_SWTYPE_SET preferredSwSet; ///< Client can use it to specify sw type(s) wanted
3636 BOOL_32 noXor; ///< Do not use xor mode for this resource
3637 UINT_32 bpp; ///< bits per pixel
3638 UINT_32 width; ///< Width (of mip0), in pixels
3639 UINT_32 height; ///< Height (of mip0), in pixels
3640 UINT_32 numSlices; ///< Number surface slice/depth (of mip0),
3641 UINT_32 numMipLevels; ///< Total mipmap levels.
3642 UINT_32 numSamples; ///< Number of samples
3643 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3644 /// number of samples for normal AA; Set it to the
3645 /// number of fragments for EQAA
3646 UINT_32 maxAlign; ///< maximum base/size alignment requested by client
3647 UINT_32 minSizeAlign; ///< memory allocated for surface in client driver will
3648 /// be padded to multiple of this value (in bytes)
3649 } ADDR2_GET_PREFERRED_SURF_SETTING_INPUT;
3650
3651 /**
3652 ****************************************************************************************************
3653 * ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT
3654 *
3655 * @brief
3656 * Output structure of Addr2GetPreferredSurfaceSetting
3657 ****************************************************************************************************
3658 */
3659 typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT
3660 {
3661 UINT_32 size; ///< Size of this structure in bytes
3662
3663 AddrSwizzleMode swizzleMode; ///< Suggested swizzle mode to be used
3664 AddrResourceType resourceType; ///< Suggested resource type to program HW
3665 ADDR2_BLOCK_SET validBlockSet; ///< Valid block type bit conbination
3666 BOOL_32 canXor; ///< If client can use xor on a valid macro block
3667 /// type
3668 ADDR2_SWTYPE_SET validSwTypeSet; ///< Valid swizzle type bit combination
3669 ADDR2_SWTYPE_SET clientPreferredSwSet; ///< Client-preferred swizzle type bit combination
3670 } ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT;
3671
3672 /**
3673 ****************************************************************************************************
3674 * Addr2GetPreferredSurfaceSetting
3675 *
3676 * @brief
3677 * Suggest a preferred setting for client driver to program HW register
3678 ****************************************************************************************************
3679 */
3680 ADDR_E_RETURNCODE ADDR_API Addr2GetPreferredSurfaceSetting(
3681 ADDR_HANDLE hLib,
3682 const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn,
3683 ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT* pOut);
3684
3685 /**
3686 ****************************************************************************************************
3687 * Addr2IsValidDisplaySwizzleMode
3688 *
3689 * @brief
3690 * Return whether the swizzle mode is supported by DCE / DCN.
3691 ****************************************************************************************************
3692 */
3693 ADDR_E_RETURNCODE ADDR_API Addr2IsValidDisplaySwizzleMode(
3694 ADDR_HANDLE hLib,
3695 AddrSwizzleMode swizzleMode,
3696 UINT_32 bpp,
3697 bool *result);
3698
3699 #if defined(__cplusplus)
3700 }
3701 #endif
3702
3703 #endif // __ADDR_INTERFACE_H__