radeon.h revision 6322c902
1209ff23fSmrg/* 2209ff23fSmrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3209ff23fSmrg * VA Linux Systems Inc., Fremont, California. 4209ff23fSmrg * 5209ff23fSmrg * All Rights Reserved. 6209ff23fSmrg * 7209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining 8209ff23fSmrg * a copy of this software and associated documentation files (the 9209ff23fSmrg * "Software"), to deal in the Software without restriction, including 10209ff23fSmrg * without limitation on the rights to use, copy, modify, merge, 11209ff23fSmrg * publish, distribute, sublicense, and/or sell copies of the Software, 12209ff23fSmrg * and to permit persons to whom the Software is furnished to do so, 13209ff23fSmrg * subject to the following conditions: 14209ff23fSmrg * 15209ff23fSmrg * The above copyright notice and this permission notice (including the 16209ff23fSmrg * next paragraph) shall be included in all copies or substantial 17209ff23fSmrg * portions of the Software. 18209ff23fSmrg * 19209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20209ff23fSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21209ff23fSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22209ff23fSmrg * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23209ff23fSmrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24209ff23fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25209ff23fSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26209ff23fSmrg * DEALINGS IN THE SOFTWARE. 27209ff23fSmrg */ 28209ff23fSmrg 29209ff23fSmrg/* 30209ff23fSmrg * Authors: 31209ff23fSmrg * Kevin E. Martin <martin@xfree86.org> 32209ff23fSmrg * Rickard E. Faith <faith@valinux.com> 33209ff23fSmrg * Alan Hourihane <alanh@fairlite.demon.co.uk> 34209ff23fSmrg * 35209ff23fSmrg */ 36209ff23fSmrg 37209ff23fSmrg#ifndef _RADEON_H_ 38209ff23fSmrg#define _RADEON_H_ 39209ff23fSmrg 40209ff23fSmrg#include <stdlib.h> /* For abs() */ 41209ff23fSmrg#include <unistd.h> /* For usleep() */ 42209ff23fSmrg#include <sys/time.h> /* For gettimeofday() */ 43209ff23fSmrg 44209ff23fSmrg#include "config.h" 4568105dcbSveego 46209ff23fSmrg#include "xf86str.h" 47209ff23fSmrg#include "compiler.h" 48209ff23fSmrg 49209ff23fSmrg /* PCI support */ 50209ff23fSmrg#include "xf86Pci.h" 51209ff23fSmrg 52209ff23fSmrg#include "exa.h" 53209ff23fSmrg 54209ff23fSmrg /* Exa and Cursor Support */ 55209ff23fSmrg#include "xf86Cursor.h" 56209ff23fSmrg 57209ff23fSmrg /* DDC support */ 58209ff23fSmrg#include "xf86DDC.h" 59209ff23fSmrg 60209ff23fSmrg /* Xv support */ 61209ff23fSmrg#include "xf86xv.h" 62209ff23fSmrg 63209ff23fSmrg#include "radeon_probe.h" 64209ff23fSmrg 65209ff23fSmrg /* DRI support */ 66b7e1c893Smrg#include "xf86drm.h" 67ad43ddacSmrg#include "radeon_drm.h" 68b7e1c893Smrg 696322c902Smrg#ifndef RADEON_GEM_NO_CPU_ACCESS 706322c902Smrg#define RADEON_GEM_NO_CPU_ACCESS (1 << 4) 716322c902Smrg#endif 726322c902Smrg 73209ff23fSmrg#ifdef DAMAGE 74209ff23fSmrg#include "damage.h" 75209ff23fSmrg#include "globals.h" 76209ff23fSmrg#endif 77209ff23fSmrg 78209ff23fSmrg#include "xf86Crtc.h" 79209ff23fSmrg#include "X11/Xatom.h" 80209ff23fSmrg 81ad43ddacSmrg#include "radeon_bo.h" 82ad43ddacSmrg#include "radeon_cs.h" 83ad43ddacSmrg#include "radeon_dri2.h" 84ad43ddacSmrg#include "drmmode_display.h" 8540732134Srjs#include "radeon_surface.h" 86ad43ddacSmrg 87209ff23fSmrg /* Render support */ 88209ff23fSmrg#ifdef RENDER 89209ff23fSmrg#include "picturestr.h" 90209ff23fSmrg#endif 91209ff23fSmrg 9268105dcbSveego#include "compat-api.h" 9368105dcbSveego 94ad43ddacSmrg#include "simple_list.h" 95209ff23fSmrg#include "atipcirename.h" 96209ff23fSmrg 976322c902Smrgstruct _SyncFence; 986322c902Smrg 99209ff23fSmrg#ifndef MAX 100209ff23fSmrg#define MAX(a,b) ((a)>(b)?(a):(b)) 101209ff23fSmrg#endif 102209ff23fSmrg#ifndef MIN 103209ff23fSmrg#define MIN(a,b) ((a)>(b)?(b):(a)) 104209ff23fSmrg#endif 105209ff23fSmrg 106b7e1c893Smrg#if HAVE_BYTESWAP_H 107b7e1c893Smrg#include <byteswap.h> 108b7e1c893Smrg#elif defined(USE_SYS_ENDIAN_H) 109b7e1c893Smrg#include <sys/endian.h> 110b7e1c893Smrg#else 111b7e1c893Smrg#define bswap_16(value) \ 112b7e1c893Smrg ((((value) & 0xff) << 8) | ((value) >> 8)) 113b7e1c893Smrg 114b7e1c893Smrg#define bswap_32(value) \ 115b7e1c893Smrg (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 116b7e1c893Smrg (uint32_t)bswap_16((uint16_t)((value) >> 16))) 117b7e1c893Smrg 118b7e1c893Smrg#define bswap_64(value) \ 119b7e1c893Smrg (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 120b7e1c893Smrg << 32) | \ 121b7e1c893Smrg (uint64_t)bswap_32((uint32_t)((value) >> 32))) 122b7e1c893Smrg#endif 123b7e1c893Smrg 124b7e1c893Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN 125b7e1c893Smrg#define le32_to_cpu(x) bswap_32(x) 126b7e1c893Smrg#define le16_to_cpu(x) bswap_16(x) 127b7e1c893Smrg#define cpu_to_le32(x) bswap_32(x) 128b7e1c893Smrg#define cpu_to_le16(x) bswap_16(x) 129b7e1c893Smrg#else 130b7e1c893Smrg#define le32_to_cpu(x) (x) 131b7e1c893Smrg#define le16_to_cpu(x) (x) 132b7e1c893Smrg#define cpu_to_le32(x) (x) 133b7e1c893Smrg#define cpu_to_le16(x) (x) 134b7e1c893Smrg#endif 135b7e1c893Smrg 136209ff23fSmrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 137209ff23fSmrg#if !defined(__GNUC__) && !defined(__FUNCTION__) 138209ff23fSmrg# define __FUNCTION__ __func__ /* C99 */ 139209ff23fSmrg#endif 140209ff23fSmrg 141209ff23fSmrgtypedef enum { 1426322c902Smrg OPTION_ACCEL, 143209ff23fSmrg OPTION_SW_CURSOR, 144209ff23fSmrg OPTION_PAGE_FLIP, 145ad43ddacSmrg OPTION_EXA_PIXMAPS, 146209ff23fSmrg OPTION_COLOR_TILING, 14740732134Srjs OPTION_COLOR_TILING_2D, 148209ff23fSmrg#ifdef RENDER 149209ff23fSmrg OPTION_RENDER_ACCEL, 150209ff23fSmrg OPTION_SUBPIXEL_ORDER, 151209ff23fSmrg#endif 152209ff23fSmrg OPTION_ACCELMETHOD, 153b7e1c893Smrg OPTION_EXA_VSYNC, 154921a55d8Smrg OPTION_ZAPHOD_HEADS, 1556322c902Smrg OPTION_SWAPBUFFERS_WAIT, 1566322c902Smrg OPTION_DELETE_DP12, 1576322c902Smrg OPTION_DRI3, 1586322c902Smrg OPTION_DRI, 1596322c902Smrg OPTION_SHADOW_PRIMARY, 1606322c902Smrg OPTION_TEAR_FREE, 161209ff23fSmrg} RADEONOpts; 162209ff23fSmrg 163209ff23fSmrg 1646322c902Smrg#if XF86_CRTC_VERSION >= 5 1656322c902Smrg#define RADEON_PIXMAP_SHARING 1 1666322c902Smrg#endif 167209ff23fSmrg 168209ff23fSmrg#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 169209ff23fSmrg 170209ff23fSmrg/* Buffer are aligned on 4096 byte boundaries */ 171ad43ddacSmrg#define RADEON_GPU_PAGE_SIZE 4096 172ad43ddacSmrg#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1) 1736322c902Smrg 174209ff23fSmrg 175209ff23fSmrg#define xFixedToFloat(f) (((float) (f)) / 65536) 176209ff23fSmrg 177209ff23fSmrg#define RADEON_LOGLEVEL_DEBUG 4 178209ff23fSmrg 179209ff23fSmrg/* for Xv, outputs */ 180209ff23fSmrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 181209ff23fSmrg 182209ff23fSmrg/* Other macros */ 183209ff23fSmrg#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 184209ff23fSmrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 185209ff23fSmrg#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 186209ff23fSmrg 187209ff23fSmrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 188209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV200) || \ 189209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS100) || \ 190209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS200) || \ 191209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV250) || \ 192209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 193209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS300)) 194209ff23fSmrg 195209ff23fSmrg 196209ff23fSmrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 197209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 198209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 199209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 200209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 201209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 202209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 203209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS480)) 204209ff23fSmrg 205209ff23fSmrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 206209ff23fSmrg 207209ff23fSmrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 208209ff23fSmrg 209b7e1c893Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) 210b7e1c893Smrg 211ad43ddacSmrg#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR)) 212ad43ddacSmrg 213921a55d8Smrg#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM)) 214921a55d8Smrg 215921a55d8Smrg#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS)) 216921a55d8Smrg 217921a55d8Smrg#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR) 218921a55d8Smrg 219b7e1c893Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) 220b7e1c893Smrg 221209ff23fSmrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 222209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R520) || \ 223209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV530) || \ 224209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R580) || \ 225209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV560) || \ 226209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV570)) 227209ff23fSmrg 2286322c902Smrg/* RS6xx, RS740 are technically R4xx as well, but the 2296322c902Smrg * clipping hardware seems to follow the r3xx restrictions 2306322c902Smrg */ 231ad43ddacSmrg#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420) || \ 2326322c902Smrg (info->ChipFamily == CHIP_FAMILY_RV410)) 233ad43ddacSmrg 234209ff23fSmrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 235209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 236209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 237209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 238209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 239209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 240209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 241209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 242209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS740) || \ 243209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 244209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS480)) 245209ff23fSmrg 246ad43ddacSmrg#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \ 247ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 248ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RS300) || \ 249ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_R200)) 250ad43ddacSmrg 2516322c902Smrg#define CURSOR_WIDTH 64 2526322c902Smrg#define CURSOR_HEIGHT 64 253209ff23fSmrg 2546322c902Smrg#define CURSOR_WIDTH_CIK 128 2556322c902Smrg#define CURSOR_HEIGHT_CIK 128 256209ff23fSmrg 257209ff23fSmrg 2586322c902Smrg#ifdef USE_GLAMOR 259209ff23fSmrg 2606322c902Smrgstruct radeon_pixmap { 2616322c902Smrg struct radeon_surface surface; 262ad43ddacSmrg 2636322c902Smrg uint_fast32_t gpu_read; 2646322c902Smrg uint_fast32_t gpu_write; 265ad43ddacSmrg 2666322c902Smrg struct radeon_bo *bo; 267ad43ddacSmrg 2686322c902Smrg uint32_t tiling_flags; 2696322c902Smrg 2706322c902Smrg /* GEM handle for glamor-only pixmaps shared via DRI3 */ 2716322c902Smrg Bool handle_valid; 2726322c902Smrg uint32_t handle; 2736322c902Smrg}; 2746322c902Smrg 2756322c902Smrgextern DevPrivateKeyRec glamor_pixmap_index; 2766322c902Smrg 2776322c902Smrgstatic inline struct radeon_pixmap *radeon_get_pixmap_private(PixmapPtr pixmap) 2786322c902Smrg{ 2796322c902Smrg return dixGetPrivate(&pixmap->devPrivates, &glamor_pixmap_index); 2806322c902Smrg} 2816322c902Smrg 2826322c902Smrgstatic inline void radeon_set_pixmap_private(PixmapPtr pixmap, struct radeon_pixmap *priv) 2836322c902Smrg{ 2846322c902Smrg dixSetPrivate(&pixmap->devPrivates, &glamor_pixmap_index, priv); 2856322c902Smrg} 2866322c902Smrg 2876322c902Smrg#endif /* USE_GLAMOR */ 288ad43ddacSmrg 289209ff23fSmrg 290ad43ddacSmrgstruct radeon_exa_pixmap_priv { 291ad43ddacSmrg struct radeon_bo *bo; 292c4ae5be6Smrg uint32_t tiling_flags; 29340732134Srjs struct radeon_surface surface; 294ad43ddacSmrg Bool bo_mapped; 2956322c902Smrg Bool shared; 296ad43ddacSmrg}; 297ad43ddacSmrg 298ad43ddacSmrg#define RADEON_2D_EXA_COPY 1 299ad43ddacSmrg#define RADEON_2D_EXA_SOLID 2 300ad43ddacSmrg 301ad43ddacSmrgstruct radeon_2d_state { 302ad43ddacSmrg int op; // 303ad43ddacSmrg uint32_t dst_pitch_offset; 304ad43ddacSmrg uint32_t src_pitch_offset; 305ad43ddacSmrg uint32_t dp_gui_master_cntl; 306ad43ddacSmrg uint32_t dp_cntl; 307ad43ddacSmrg uint32_t dp_write_mask; 308ad43ddacSmrg uint32_t dp_brush_frgd_clr; 309ad43ddacSmrg uint32_t dp_brush_bkgd_clr; 310ad43ddacSmrg uint32_t dp_src_frgd_clr; 311ad43ddacSmrg uint32_t dp_src_bkgd_clr; 312ad43ddacSmrg uint32_t default_sc_bottom_right; 3136322c902Smrg uint32_t dst_domain; 314ad43ddacSmrg struct radeon_bo *dst_bo; 315ad43ddacSmrg struct radeon_bo *src_bo; 316ad43ddacSmrg}; 317ad43ddacSmrg 318ad43ddacSmrg#define DMA_BO_FREE_TIME 1000 319ad43ddacSmrg 320ad43ddacSmrgstruct radeon_dma_bo { 321ad43ddacSmrg struct radeon_dma_bo *next, *prev; 322ad43ddacSmrg struct radeon_bo *bo; 323ad43ddacSmrg int expire_counter; 324ad43ddacSmrg}; 325ad43ddacSmrg 326ad43ddacSmrgstruct r600_accel_object { 327ad43ddacSmrg uint32_t pitch; 328ad43ddacSmrg uint32_t width; 329ad43ddacSmrg uint32_t height; 330ad43ddacSmrg int bpp; 331ad43ddacSmrg uint32_t domain; 332ad43ddacSmrg struct radeon_bo *bo; 333b13dfe66Smrg uint32_t tiling_flags; 33440732134Srjs struct radeon_surface *surface; 335ad43ddacSmrg}; 336ad43ddacSmrg 337921a55d8Smrgstruct radeon_vbo_object { 338921a55d8Smrg int vb_offset; 339921a55d8Smrg int vb_total; 340921a55d8Smrg uint32_t vb_size; 341921a55d8Smrg uint32_t vb_op_vert_size; 342921a55d8Smrg int32_t vb_start_op; 343921a55d8Smrg struct radeon_bo *vb_bo; 344921a55d8Smrg unsigned verts_per_op; 345921a55d8Smrg}; 346921a55d8Smrg 347b7e1c893Smrgstruct radeon_accel_state { 3486322c902Smrg 349b7e1c893Smrg /* Saved values for ScreenToScreenCopy */ 350b7e1c893Smrg int xdir; 351b7e1c893Smrg int ydir; 352209ff23fSmrg 353b7e1c893Smrg /* render accel */ 354b7e1c893Smrg unsigned short texW[2]; 355b7e1c893Smrg unsigned short texH[2]; 356b7e1c893Smrg Bool XInited3D; /* X itself has the 3D context */ 357b7e1c893Smrg int num_gb_pipes; 358b7e1c893Smrg Bool has_tcl; 359c4ae5be6Smrg Bool allowHWDFS; 360209ff23fSmrg 361b7e1c893Smrg /* EXA */ 362b7e1c893Smrg ExaDriverPtr exa; 363b7e1c893Smrg int exaSyncMarker; 364b7e1c893Smrg int exaMarkerSynced; 365b7e1c893Smrg int engineMode; 366b7e1c893Smrg#define EXA_ENGINEMODE_UNKNOWN 0 367b7e1c893Smrg#define EXA_ENGINEMODE_2D 1 368b7e1c893Smrg#define EXA_ENGINEMODE_3D 2 369209ff23fSmrg 370ad43ddacSmrg int composite_op; 371ad43ddacSmrg PicturePtr dst_pic; 372ad43ddacSmrg PicturePtr msk_pic; 373ad43ddacSmrg PicturePtr src_pic; 374ad43ddacSmrg PixmapPtr dst_pix; 375ad43ddacSmrg PixmapPtr msk_pix; 376ad43ddacSmrg PixmapPtr src_pix; 377b7e1c893Smrg Bool is_transform[2]; 378b7e1c893Smrg PictTransform *transform[2]; 379b7e1c893Smrg /* Whether we are tiling horizontally and vertically */ 380b7e1c893Smrg Bool need_src_tile_x; 381b7e1c893Smrg Bool need_src_tile_y; 382b7e1c893Smrg /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ 383b7e1c893Smrg Bool src_tile_width; 384b7e1c893Smrg Bool src_tile_height; 385ad43ddacSmrg uint32_t *draw_header; 386ad43ddacSmrg unsigned vtx_count; 387ad43ddacSmrg unsigned num_vtx; 388b7e1c893Smrg Bool vsync; 389b7e1c893Smrg 390921a55d8Smrg struct radeon_vbo_object vbo; 391921a55d8Smrg struct radeon_vbo_object cbuf; 392921a55d8Smrg 393ad43ddacSmrg /* where to discard IB from if we cancel operation */ 394ad43ddacSmrg uint32_t ib_reset_op; 395ad43ddacSmrg struct radeon_dma_bo bo_free; 396ad43ddacSmrg struct radeon_dma_bo bo_wait; 397ad43ddacSmrg struct radeon_dma_bo bo_reserved; 398ad43ddacSmrg Bool use_vbos; 3990974d292Smrg void (*finish_op)(ScrnInfoPtr, int); 400b7e1c893Smrg // shader storage 401ad43ddacSmrg struct radeon_bo *shaders_bo; 402b7e1c893Smrg uint32_t solid_vs_offset; 403b7e1c893Smrg uint32_t solid_ps_offset; 404b7e1c893Smrg uint32_t copy_vs_offset; 405b7e1c893Smrg uint32_t copy_ps_offset; 406b7e1c893Smrg uint32_t comp_vs_offset; 407b7e1c893Smrg uint32_t comp_ps_offset; 408b7e1c893Smrg uint32_t xv_vs_offset; 409b7e1c893Smrg uint32_t xv_ps_offset; 410921a55d8Smrg // shader consts 411921a55d8Smrg uint32_t solid_vs_const_offset; 412921a55d8Smrg uint32_t solid_ps_const_offset; 413921a55d8Smrg uint32_t copy_vs_const_offset; 414921a55d8Smrg uint32_t copy_ps_const_offset; 415921a55d8Smrg uint32_t comp_vs_const_offset; 416921a55d8Smrg uint32_t comp_ps_const_offset; 417921a55d8Smrg uint32_t comp_mask_ps_const_offset; 418921a55d8Smrg uint32_t xv_vs_const_offset; 419921a55d8Smrg uint32_t xv_ps_const_offset; 420b7e1c893Smrg 421b7e1c893Smrg //size/addr stuff 422ad43ddacSmrg struct r600_accel_object src_obj[2]; 423ad43ddacSmrg struct r600_accel_object dst_obj; 424b7e1c893Smrg uint32_t src_size[2]; 425b7e1c893Smrg uint32_t dst_size; 426ad43ddacSmrg 427b7e1c893Smrg uint32_t vs_size; 428b7e1c893Smrg uint64_t vs_mc_addr; 429b7e1c893Smrg uint32_t ps_size; 430b7e1c893Smrg uint64_t ps_mc_addr; 431b7e1c893Smrg 43240732134Srjs // solid/copy 4336322c902Smrg void *copy_area; 434ad43ddacSmrg struct radeon_bo *copy_area_bo; 435b7e1c893Smrg Bool same_surface; 436b7e1c893Smrg int rop; 437b7e1c893Smrg uint32_t planemask; 43840732134Srjs uint32_t fg; 439b7e1c893Smrg 440b7e1c893Smrg // composite 441b7e1c893Smrg Bool component_alpha; 442b7e1c893Smrg Bool src_alpha; 443ad43ddacSmrg // vline 444ad43ddacSmrg xf86CrtcPtr vline_crtc; 445ad43ddacSmrg int vline_y1; 446ad43ddacSmrg int vline_y2; 447209ff23fSmrg 4486322c902Smrg Bool force; 449b7e1c893Smrg}; 450b7e1c893Smrg 451b7e1c893Smrgtypedef struct { 452b7e1c893Smrg EntityInfoPtr pEnt; 453b7e1c893Smrg pciVideoPtr PciInfo; 454b7e1c893Smrg int Chipset; 455b7e1c893Smrg RADEONChipFamily ChipFamily; 4566322c902Smrg 45768105dcbSveego Bool (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL); 458b7e1c893Smrg 45968105dcbSveego void (*BlockHandler)(BLOCKHANDLER_ARGS_DECL); 460b7e1c893Smrg 4616322c902Smrg void (*CreateFence) (ScreenPtr pScreen, struct _SyncFence *pFence, 4626322c902Smrg Bool initially_triggered); 463b7e1c893Smrg 464b7e1c893Smrg int pix24bpp; /* Depth of pixmap for 24bpp fb */ 465b7e1c893Smrg Bool dac6bits; /* Use 6 bit DAC? */ 466b7e1c893Smrg 4676322c902Smrg int pixel_bytes; 468b7e1c893Smrg 469b7e1c893Smrg Bool directRenderingEnabled; 470ad43ddacSmrg struct radeon_dri2 dri2; 471209ff23fSmrg 472b7e1c893Smrg /* accel */ 473b7e1c893Smrg Bool RenderAccel; /* Render */ 474b7e1c893Smrg Bool allowColorTiling; 47540732134Srjs Bool allowColorTiling2D; 4766322c902Smrg uint_fast32_t gpu_flushed; 4776322c902Smrg uint_fast32_t gpu_synced; 478b7e1c893Smrg struct radeon_accel_state *accel_state; 4796322c902Smrg PixmapPtr fbcon_pixmap; 480b7e1c893Smrg Bool accelOn; 4816322c902Smrg Bool use_glamor; 4826322c902Smrg Bool shadow_primary; 4836322c902Smrg Bool tear_free; 484ad43ddacSmrg Bool exa_pixmaps; 485ad43ddacSmrg Bool exa_force_create; 486b7e1c893Smrg XF86ModReqInfo exaReq; 4876322c902Smrg Bool is_fast_fb; /* use direct mapping for fast fb access */ 488b7e1c893Smrg 489ad43ddacSmrg unsigned int xv_max_width; 490ad43ddacSmrg unsigned int xv_max_height; 491209ff23fSmrg 492209ff23fSmrg /* general */ 493209ff23fSmrg OptionInfoPtr Options; 494209ff23fSmrg 4956322c902Smrg DisplayModePtr currentMode; 496209ff23fSmrg 497209ff23fSmrg CreateScreenResourcesProcPtr CreateScreenResources; 4986322c902Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10 4996322c902Smrg CreateWindowProcPtr CreateWindow; 5006322c902Smrg#endif 501209ff23fSmrg 502209ff23fSmrg Bool IsSecondary; 503209ff23fSmrg 504209ff23fSmrg Bool r600_shadow_fb; 505209ff23fSmrg void *fb_shadow; 506209ff23fSmrg 507ad43ddacSmrg void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB 508ad43ddacSmrg struct radeon_2d_state state_2d; 509ad43ddacSmrg struct radeon_bo *front_bo; 510ad43ddacSmrg struct radeon_bo_manager *bufmgr; 511ad43ddacSmrg struct radeon_cs_manager *csm; 512ad43ddacSmrg struct radeon_cs *cs; 513ad43ddacSmrg 51440732134Srjs struct radeon_bo *cursor_bo[32]; 515ad43ddacSmrg uint64_t vram_size; 516ad43ddacSmrg uint64_t gart_size; 517ad43ddacSmrg drmmode_rec drmmode; 5186322c902Smrg Bool drmmode_inited; 5190974d292Smrg /* r6xx+ tile config */ 520b13dfe66Smrg Bool have_tiling_info; 5210974d292Smrg uint32_t tile_config; 5220974d292Smrg int group_bytes; 5230974d292Smrg int num_channels; 5240974d292Smrg int num_banks; 5250974d292Smrg int r7xx_bank_op; 52640732134Srjs struct radeon_surface_manager *surf_man; 52740732134Srjs struct radeon_surface front_surface; 528ad43ddacSmrg 529ad43ddacSmrg /* Xv bicubic filtering */ 530ad43ddacSmrg struct radeon_bo *bicubic_bo; 5316322c902Smrg 532921a55d8Smrg /* kms pageflipping */ 533921a55d8Smrg Bool allowPageFlip; 534921a55d8Smrg 535921a55d8Smrg /* Perform vsync'ed SwapBuffers? */ 536921a55d8Smrg Bool swapBuffersWait; 537209ff23fSmrg 5386322c902Smrg /* cursor size */ 5396322c902Smrg int cursor_w; 5406322c902Smrg int cursor_h; 541209ff23fSmrg 5426322c902Smrg /* If bit n of this field is set, xf86_config->crtc[n] currently can't 5436322c902Smrg * use the HW cursor 5446322c902Smrg */ 5456322c902Smrg unsigned hwcursor_disabled; 5466322c902Smrg 5476322c902Smrg#ifdef USE_GLAMOR 5486322c902Smrg struct { 5496322c902Smrg CreateGCProcPtr SavedCreateGC; 5506322c902Smrg RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, int, int, 5516322c902Smrg int, int, int, int); 5526322c902Smrg void (*SavedPolyFillRect)(DrawablePtr, GCPtr, int, xRectangle*); 5536322c902Smrg CloseScreenProcPtr SavedCloseScreen; 5546322c902Smrg GetImageProcPtr SavedGetImage; 5556322c902Smrg GetSpansProcPtr SavedGetSpans; 5566322c902Smrg CreatePixmapProcPtr SavedCreatePixmap; 5576322c902Smrg DestroyPixmapProcPtr SavedDestroyPixmap; 5586322c902Smrg CopyWindowProcPtr SavedCopyWindow; 5596322c902Smrg ChangeWindowAttributesProcPtr SavedChangeWindowAttributes; 5606322c902Smrg BitmapToRegionProcPtr SavedBitmapToRegion; 5616322c902Smrg#ifdef RENDER 5626322c902Smrg CompositeProcPtr SavedComposite; 5636322c902Smrg TrianglesProcPtr SavedTriangles; 5646322c902Smrg GlyphsProcPtr SavedGlyphs; 5656322c902Smrg TrapezoidsProcPtr SavedTrapezoids; 5666322c902Smrg AddTrapsProcPtr SavedAddTraps; 5676322c902Smrg UnrealizeGlyphProcPtr SavedUnrealizeGlyph; 5686322c902Smrg#endif 5696322c902Smrg#ifdef RADEON_PIXMAP_SHARING 5706322c902Smrg SharePixmapBackingProcPtr SavedSharePixmapBacking; 5716322c902Smrg SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking; 5726322c902Smrg#endif 5736322c902Smrg } glamor; 5746322c902Smrg#endif /* USE_GLAMOR */ 5756322c902Smrg} RADEONInfoRec, *RADEONInfoPtr; 576b7e1c893Smrg 577209ff23fSmrg/* radeon_accel.c */ 578209ff23fSmrgextern Bool RADEONAccelInit(ScreenPtr pScreen); 579209ff23fSmrgextern void RADEONEngineInit(ScrnInfoPtr pScrn); 580209ff23fSmrgextern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 581209ff23fSmrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 5822f39173dSmrgextern int radeon_cs_space_remaining(ScrnInfoPtr pScrn); 583209ff23fSmrg 584209ff23fSmrg/* radeon_commonfuncs.c */ 5856322c902Smrgextern void RADEONWaitForVLine(ScrnInfoPtr pScrn, PixmapPtr pPix, 5866322c902Smrg xf86CrtcPtr crtc, int start, int stop); 5876322c902Smrg 588209ff23fSmrg 589209ff23fSmrg/* radeon_exa.c */ 59040732134Srjsextern unsigned eg_tile_split(unsigned tile_split); 591b13dfe66Smrgextern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t); 592209ff23fSmrg 593209ff23fSmrg/* radeon_exa_funcs.c */ 5946322c902Smrgextern Bool RADEONDrawInit(ScreenPtr pScreen); 595b7e1c893Smrgextern Bool R600DrawInit(ScreenPtr pScreen); 596b7e1c893Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn); 597921a55d8Smrgextern Bool EVERGREENDrawInit(ScreenPtr pScreen); 598209ff23fSmrg 599209ff23fSmrg/* radeon_exa.c */ 600209ff23fSmrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 601209ff23fSmrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 602209ff23fSmrg uint32_t *pitch_offset); 603209ff23fSmrg 6046322c902Smrg/* radeon_dri3.c */ 6056322c902SmrgBool radeon_dri3_screen_init(ScreenPtr screen); 6066322c902Smrg 6076322c902Smrg/* radeon_kms.c */ 6086322c902Smrgvoid radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, 6096322c902Smrg uint64_t usec, void *event_data); 6106322c902Smrg 6116322c902Smrg/* radeon_present.c */ 6126322c902SmrgBool radeon_present_screen_init(ScreenPtr screen); 6136322c902Smrg 6146322c902Smrg/* radeon_sync.c */ 6156322c902Smrgextern Bool radeon_sync_init(ScreenPtr screen); 6166322c902Smrgextern void radeon_sync_close(ScreenPtr screen); 617209ff23fSmrg 618209ff23fSmrg/* radeon_video.c */ 619209ff23fSmrgextern void RADEONInitVideo(ScreenPtr pScreen); 620209ff23fSmrgextern void RADEONResetVideo(ScrnInfoPtr pScrn); 621ad43ddacSmrgextern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn); 622ad43ddacSmrgextern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn, 6236322c902Smrg Bool consider_disabled, 624ad43ddacSmrg int x1, int x2, int y1, int y2); 625209ff23fSmrg 626ad43ddacSmrgextern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn); 627ad43ddacSmrgextern void radeon_ddx_cs_start(ScrnInfoPtr pScrn, 628ad43ddacSmrg int num, const char *file, 629ad43ddacSmrg const char *func, int line); 6306322c902Smrgvoid radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, uint32_t new_fb_size); 6316322c902Smrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 632209ff23fSmrg 6336322c902SmrgdrmVBlankSeqType radeon_populate_vbl_request_type(xf86CrtcPtr crtc); 634209ff23fSmrg 6356322c902Smrgstatic inline struct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix) 6366322c902Smrg{ 6376322c902Smrg#ifdef USE_GLAMOR 6386322c902Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 6396322c902Smrg 6406322c902Smrg if (info->use_glamor) { 6416322c902Smrg struct radeon_pixmap *priv; 6426322c902Smrg priv = radeon_get_pixmap_private(pPix); 6436322c902Smrg return priv ? &priv->surface : NULL; 6446322c902Smrg } else 6456322c902Smrg#endif 6466322c902Smrg { 6476322c902Smrg struct radeon_exa_pixmap_priv *driver_priv; 6486322c902Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 6496322c902Smrg return &driver_priv->surface; 6506322c902Smrg } 6516322c902Smrg 6526322c902Smrg return NULL; 6536322c902Smrg} 654209ff23fSmrg 6556322c902Smrguint32_t radeon_get_pixmap_tiling(PixmapPtr pPix); 656209ff23fSmrg 6576322c902Smrgstatic inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo) 6586322c902Smrg{ 6596322c902Smrg ScreenPtr pScreen = pPix->drawable.pScreen; 6606322c902Smrg 6616322c902Smrg#ifdef USE_GLAMOR 6626322c902Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 6636322c902Smrg 6646322c902Smrg if (info->use_glamor) { 6656322c902Smrg struct radeon_pixmap *priv; 6666322c902Smrg 6676322c902Smrg priv = radeon_get_pixmap_private(pPix); 6686322c902Smrg if (priv == NULL && bo == NULL) 6696322c902Smrg return; 6706322c902Smrg 6716322c902Smrg if (priv) { 6726322c902Smrg if (priv->bo == bo) 6736322c902Smrg return; 6746322c902Smrg 6756322c902Smrg if (priv->bo) 6766322c902Smrg radeon_bo_unref(priv->bo); 6776322c902Smrg 6786322c902Smrg if (!bo) { 6796322c902Smrg free(priv); 6806322c902Smrg priv = NULL; 6816322c902Smrg } 6826322c902Smrg } 6836322c902Smrg 6846322c902Smrg if (bo) { 6856322c902Smrg uint32_t pitch; 6866322c902Smrg 6876322c902Smrg if (!priv) { 6886322c902Smrg priv = calloc(1, sizeof (struct radeon_pixmap)); 6896322c902Smrg if (!priv) 6906322c902Smrg goto out; 6916322c902Smrg } 6926322c902Smrg 6936322c902Smrg radeon_bo_ref(bo); 6946322c902Smrg priv->bo = bo; 6956322c902Smrg 6966322c902Smrg if (radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch) == 0 && 6976322c902Smrg pitch != pPix->devKind) 6986322c902Smrg pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL); 6996322c902Smrg } 7006322c902Smrgout: 7016322c902Smrg radeon_set_pixmap_private(pPix, priv); 7026322c902Smrg } else 7036322c902Smrg#endif /* USE_GLAMOR */ 7046322c902Smrg { 7056322c902Smrg struct radeon_exa_pixmap_priv *driver_priv; 7066322c902Smrg 7076322c902Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 7086322c902Smrg if (driver_priv) { 7096322c902Smrg uint32_t pitch; 7106322c902Smrg 7116322c902Smrg if (driver_priv->bo) 7126322c902Smrg radeon_bo_unref(driver_priv->bo); 7136322c902Smrg 7146322c902Smrg radeon_bo_ref(bo); 7156322c902Smrg driver_priv->bo = bo; 7166322c902Smrg 7176322c902Smrg if (radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch) == 0 && 7186322c902Smrg pitch != pPix->devKind) 7196322c902Smrg pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL); 7206322c902Smrg } 7216322c902Smrg } 7226322c902Smrg} 723209ff23fSmrg 7246322c902Smrgstatic inline struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix) 7256322c902Smrg{ 7266322c902Smrg#ifdef USE_GLAMOR 7276322c902Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 7286322c902Smrg 7296322c902Smrg if (info->use_glamor) { 7306322c902Smrg struct radeon_pixmap *priv; 7316322c902Smrg priv = radeon_get_pixmap_private(pPix); 7326322c902Smrg return priv ? priv->bo : NULL; 7336322c902Smrg } else 7346322c902Smrg#endif 7356322c902Smrg { 7366322c902Smrg struct radeon_exa_pixmap_priv *driver_priv; 7376322c902Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 7386322c902Smrg return driver_priv ? driver_priv->bo : NULL; 7396322c902Smrg } 7406322c902Smrg 7416322c902Smrg return NULL; 7426322c902Smrg} 743209ff23fSmrg 7446322c902Smrgstatic inline Bool radeon_get_pixmap_shared(PixmapPtr pPix) 7456322c902Smrg{ 7466322c902Smrg#ifdef USE_GLAMOR 7476322c902Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 7486322c902Smrg 7496322c902Smrg if (info->use_glamor) { 7506322c902Smrg ErrorF("glamor sharing todo\n"); 7516322c902Smrg return FALSE; 7526322c902Smrg } else 7536322c902Smrg#endif 7546322c902Smrg { 7556322c902Smrg struct radeon_exa_pixmap_priv *driver_priv; 7566322c902Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 7576322c902Smrg return driver_priv->shared; 7586322c902Smrg } 7596322c902Smrg return FALSE; 7606322c902Smrg} 761209ff23fSmrg 762209ff23fSmrg#define CP_PACKET0(reg, n) \ 763209ff23fSmrg (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 764209ff23fSmrg#define CP_PACKET1(reg0, reg1) \ 765209ff23fSmrg (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 766209ff23fSmrg#define CP_PACKET2() \ 767209ff23fSmrg (RADEON_CP_PACKET2) 768209ff23fSmrg#define CP_PACKET3(pkt, n) \ 769209ff23fSmrg (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 770209ff23fSmrg 771209ff23fSmrg 772209ff23fSmrg#define RADEON_VERBOSE 0 773209ff23fSmrg 774209ff23fSmrg#define BEGIN_RING(n) do { \ 775209ff23fSmrg if (RADEON_VERBOSE) { \ 776209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 777209ff23fSmrg "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 778209ff23fSmrg } \ 7796322c902Smrg radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__); \ 780209ff23fSmrg} while (0) 781209ff23fSmrg 782209ff23fSmrg#define ADVANCE_RING() do { \ 7836322c902Smrg radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ 784ad43ddacSmrg } while (0) 785209ff23fSmrg 786209ff23fSmrg#define OUT_RING(x) do { \ 787209ff23fSmrg if (RADEON_VERBOSE) { \ 788209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 789209ff23fSmrg " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 790209ff23fSmrg } \ 7916322c902Smrg radeon_cs_write_dword(info->cs, (x)); \ 792209ff23fSmrg} while (0) 793209ff23fSmrg 794209ff23fSmrg#define OUT_RING_REG(reg, val) \ 795209ff23fSmrgdo { \ 796209ff23fSmrg OUT_RING(CP_PACKET0(reg, 0)); \ 797209ff23fSmrg OUT_RING(val); \ 798209ff23fSmrg} while (0) 799209ff23fSmrg 800ad43ddacSmrg#define OUT_RING_RELOC(x, read_domains, write_domain) \ 801ad43ddacSmrg do { \ 802ad43ddacSmrg int _ret; \ 803ad43ddacSmrg _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \ 804ad43ddacSmrg if (_ret) ErrorF("reloc emit failure %d\n", _ret); \ 805ad43ddacSmrg } while(0) 806ad43ddacSmrg 807ad43ddacSmrg 808209ff23fSmrg#define FLUSH_RING() \ 809209ff23fSmrgdo { \ 810209ff23fSmrg if (RADEON_VERBOSE) \ 811209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 812209ff23fSmrg "FLUSH_RING in %s\n", __FUNCTION__); \ 8136322c902Smrg radeon_cs_flush_indirect(pScrn); \ 814209ff23fSmrg} while (0) 815209ff23fSmrg 816ad43ddacSmrg#define CS_FULL(cs) ((cs)->cdw > 15 * 1024) 817ad43ddacSmrg 818b7e1c893Smrg#define RADEON_SWITCH_TO_2D() \ 819b7e1c893Smrgdo { \ 820b7e1c893Smrg uint32_t flush = 0; \ 821b7e1c893Smrg switch (info->accel_state->engineMode) { \ 822b7e1c893Smrg case EXA_ENGINEMODE_UNKNOWN: \ 823b7e1c893Smrg flush = 1; \ 824ad43ddacSmrg break; \ 825ad43ddacSmrg case EXA_ENGINEMODE_3D: \ 8266322c902Smrg flush = CS_FULL(info->cs); \ 827ad43ddacSmrg break; \ 828b7e1c893Smrg case EXA_ENGINEMODE_2D: \ 8296322c902Smrg flush = CS_FULL(info->cs); \ 830b7e1c893Smrg break; \ 831b7e1c893Smrg } \ 832ad43ddacSmrg if (flush) { \ 8336322c902Smrg radeon_cs_flush_indirect(pScrn); \ 834ad43ddacSmrg } \ 835b7e1c893Smrg info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ 836b7e1c893Smrg} while (0); 837b7e1c893Smrg 838b7e1c893Smrg#define RADEON_SWITCH_TO_3D() \ 839b7e1c893Smrgdo { \ 840b7e1c893Smrg uint32_t flush = 0; \ 841b7e1c893Smrg switch (info->accel_state->engineMode) { \ 842b7e1c893Smrg case EXA_ENGINEMODE_UNKNOWN: \ 843b7e1c893Smrg flush = 1; \ 844ad43ddacSmrg break; \ 845ad43ddacSmrg case EXA_ENGINEMODE_2D: \ 8466322c902Smrg flush = CS_FULL(info->cs); \ 847ad43ddacSmrg break; \ 848b7e1c893Smrg case EXA_ENGINEMODE_3D: \ 8496322c902Smrg flush = CS_FULL(info->cs); \ 850b7e1c893Smrg break; \ 851b7e1c893Smrg } \ 852b7e1c893Smrg if (flush) { \ 8536322c902Smrg radeon_cs_flush_indirect(pScrn); \ 854b7e1c893Smrg } \ 855ad43ddacSmrg if (!info->accel_state->XInited3D) \ 856ad43ddacSmrg RADEONInit3DEngine(pScrn); \ 857b7e1c893Smrg info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ 858b7e1c893Smrg} while (0); 859b7e1c893Smrg 8606322c902Smrg /* Memory mapped register access macros */ 8616322c902Smrg 8626322c902Smrg#define BEGIN_ACCEL_RELOC(n, r) do { \ 8636322c902Smrg int _nqw = (n) + (r); \ 8646322c902Smrg BEGIN_RING(2*_nqw); \ 8656322c902Smrg } while (0) 8666322c902Smrg 8676322c902Smrg#define EMIT_OFFSET(reg, value, pPix, rd, wd) do { \ 8686322c902Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); \ 8696322c902Smrg OUT_RING_REG((reg), (value)); \ 8706322c902Smrg OUT_RING_RELOC(driver_priv->bo, (rd), (wd)); \ 8716322c902Smrg } while(0) 8726322c902Smrg 8736322c902Smrg#define EMIT_READ_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT), 0) 8746322c902Smrg#define EMIT_WRITE_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, 0, RADEON_GEM_DOMAIN_VRAM) 8756322c902Smrg 8766322c902Smrg#define OUT_TEXTURE_REG(reg, offset, bo) do { \ 8776322c902Smrg OUT_RING_REG((reg), (offset)); \ 8786322c902Smrg OUT_RING_RELOC((bo), RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); \ 8796322c902Smrg } while(0) 8806322c902Smrg 8816322c902Smrg#define EMIT_COLORPITCH(reg, value, pPix) do { \ 8826322c902Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); \ 8836322c902Smrg OUT_RING_REG((reg), value); \ 8846322c902Smrg OUT_RING_RELOC(driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); \ 8856322c902Smrg} while(0) 886209ff23fSmrg 887209ff23fSmrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 888209ff23fSmrg{ 8896322c902Smrg if (pScrn->pScreen) 890209ff23fSmrg exaWaitSync(pScrn->pScreen); 891209ff23fSmrg} 892209ff23fSmrg 8936322c902Smrgenum { 8946322c902Smrg RADEON_CREATE_PIXMAP_SCANOUT = 0x02000000, 8956322c902Smrg RADEON_CREATE_PIXMAP_DRI2 = 0x04000000, 8966322c902Smrg RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE = 0x08000000, 8976322c902Smrg RADEON_CREATE_PIXMAP_TILING_MACRO = 0x10000000, 8986322c902Smrg RADEON_CREATE_PIXMAP_TILING_MICRO = 0x20000000, 8996322c902Smrg RADEON_CREATE_PIXMAP_DEPTH = 0x40000000, /* for r200 */ 9006322c902Smrg RADEON_CREATE_PIXMAP_SZBUFFER = 0x80000000, /* for eg */ 9016322c902Smrg}; 902209ff23fSmrg 9036322c902Smrg#define RADEON_CREATE_PIXMAP_TILING_FLAGS \ 9046322c902Smrg (RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE | \ 9056322c902Smrg RADEON_CREATE_PIXMAP_TILING_MACRO | \ 9066322c902Smrg RADEON_CREATE_PIXMAP_TILING_MICRO | \ 9076322c902Smrg RADEON_CREATE_PIXMAP_DEPTH | \ 9086322c902Smrg RADEON_CREATE_PIXMAP_SZBUFFER) 9096322c902Smrg 9106322c902Smrg 9116322c902Smrg/* Compute log base 2 of val. */ 9126322c902Smrgstatic __inline__ int 9136322c902SmrgRADEONLog2(int val) 914209ff23fSmrg{ 9156322c902Smrg int bits; 9166322c902Smrg#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__) 9176322c902Smrg __asm volatile("bsrl %1, %0" 9186322c902Smrg : "=r" (bits) 9196322c902Smrg : "c" (val) 9206322c902Smrg ); 9216322c902Smrg return bits; 9226322c902Smrg#else 9236322c902Smrg for (bits = 0; val != 0; val >>= 1, ++bits) 9246322c902Smrg ; 9256322c902Smrg return bits - 1; 9266322c902Smrg#endif 927209ff23fSmrg} 928209ff23fSmrg 9296322c902Smrg#define RADEON_TILING_MASK 0xff 9306322c902Smrg#define RADEON_TILING_LINEAR 0x0 931ad43ddacSmrg 932209ff23fSmrg#endif /* _RADEON_H_ */ 933