radeon.h revision 0d16fef4
1de2362d3Smrg/* 2de2362d3Smrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3de2362d3Smrg * VA Linux Systems Inc., Fremont, California. 4de2362d3Smrg * 5de2362d3Smrg * All Rights Reserved. 6de2362d3Smrg * 7de2362d3Smrg * Permission is hereby granted, free of charge, to any person obtaining 8de2362d3Smrg * a copy of this software and associated documentation files (the 9de2362d3Smrg * "Software"), to deal in the Software without restriction, including 10de2362d3Smrg * without limitation on the rights to use, copy, modify, merge, 11de2362d3Smrg * publish, distribute, sublicense, and/or sell copies of the Software, 12de2362d3Smrg * and to permit persons to whom the Software is furnished to do so, 13de2362d3Smrg * subject to the following conditions: 14de2362d3Smrg * 15de2362d3Smrg * The above copyright notice and this permission notice (including the 16de2362d3Smrg * next paragraph) shall be included in all copies or substantial 17de2362d3Smrg * portions of the Software. 18de2362d3Smrg * 19de2362d3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20de2362d3Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21de2362d3Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22de2362d3Smrg * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23de2362d3Smrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24de2362d3Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25de2362d3Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26de2362d3Smrg * DEALINGS IN THE SOFTWARE. 27de2362d3Smrg */ 28de2362d3Smrg 29de2362d3Smrg/* 30de2362d3Smrg * Authors: 31de2362d3Smrg * Kevin E. Martin <martin@xfree86.org> 32de2362d3Smrg * Rickard E. Faith <faith@valinux.com> 33de2362d3Smrg * Alan Hourihane <alanh@fairlite.demon.co.uk> 34de2362d3Smrg * 35de2362d3Smrg */ 36de2362d3Smrg 37de2362d3Smrg#ifndef _RADEON_H_ 38de2362d3Smrg#define _RADEON_H_ 39de2362d3Smrg 40de2362d3Smrg#include <stdlib.h> /* For abs() */ 41de2362d3Smrg#include <unistd.h> /* For usleep() */ 42de2362d3Smrg#include <sys/time.h> /* For gettimeofday() */ 43de2362d3Smrg 44de2362d3Smrg#include "config.h" 45de2362d3Smrg 46de2362d3Smrg#include "xf86str.h" 47de2362d3Smrg#include "compiler.h" 48de2362d3Smrg 49de2362d3Smrg /* PCI support */ 50de2362d3Smrg#include "xf86Pci.h" 51de2362d3Smrg 52de2362d3Smrg#include "exa.h" 53de2362d3Smrg 54de2362d3Smrg /* Exa and Cursor Support */ 55de2362d3Smrg#include "xf86Cursor.h" 56de2362d3Smrg 57de2362d3Smrg /* DDC support */ 58de2362d3Smrg#include "xf86DDC.h" 59de2362d3Smrg 60de2362d3Smrg /* Xv support */ 61de2362d3Smrg#include "xf86xv.h" 62de2362d3Smrg 63de2362d3Smrg#include "radeon_probe.h" 64de2362d3Smrg 65de2362d3Smrg /* DRI support */ 66de2362d3Smrg#include "xf86drm.h" 67de2362d3Smrg#include "radeon_drm.h" 68de2362d3Smrg 690d16fef4Smrg#ifndef RADEON_GEM_NO_CPU_ACCESS 700d16fef4Smrg#define RADEON_GEM_NO_CPU_ACCESS (1 << 4) 710d16fef4Smrg#endif 720d16fef4Smrg 73de2362d3Smrg#ifdef DAMAGE 74de2362d3Smrg#include "damage.h" 75de2362d3Smrg#include "globals.h" 76de2362d3Smrg#endif 77de2362d3Smrg 78de2362d3Smrg#include "xf86Crtc.h" 79de2362d3Smrg#include "X11/Xatom.h" 80de2362d3Smrg 81de2362d3Smrg#include "radeon_bo.h" 82de2362d3Smrg#include "radeon_cs.h" 83de2362d3Smrg#include "radeon_dri2.h" 84de2362d3Smrg#include "drmmode_display.h" 85de2362d3Smrg#include "radeon_surface.h" 86de2362d3Smrg 87de2362d3Smrg /* Render support */ 88de2362d3Smrg#ifdef RENDER 89de2362d3Smrg#include "picturestr.h" 90de2362d3Smrg#endif 91de2362d3Smrg 92de2362d3Smrg#include "compat-api.h" 93de2362d3Smrg 94de2362d3Smrg#include "simple_list.h" 95de2362d3Smrg#include "atipcirename.h" 96de2362d3Smrg 970d16fef4Smrgstruct _SyncFence; 980d16fef4Smrg 99de2362d3Smrg#ifndef MAX 100de2362d3Smrg#define MAX(a,b) ((a)>(b)?(a):(b)) 101de2362d3Smrg#endif 102de2362d3Smrg#ifndef MIN 103de2362d3Smrg#define MIN(a,b) ((a)>(b)?(b):(a)) 104de2362d3Smrg#endif 105de2362d3Smrg 106de2362d3Smrg#if HAVE_BYTESWAP_H 107de2362d3Smrg#include <byteswap.h> 108de2362d3Smrg#elif defined(USE_SYS_ENDIAN_H) 109de2362d3Smrg#include <sys/endian.h> 110de2362d3Smrg#else 111de2362d3Smrg#define bswap_16(value) \ 112de2362d3Smrg ((((value) & 0xff) << 8) | ((value) >> 8)) 113de2362d3Smrg 114de2362d3Smrg#define bswap_32(value) \ 115de2362d3Smrg (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 116de2362d3Smrg (uint32_t)bswap_16((uint16_t)((value) >> 16))) 117de2362d3Smrg 118de2362d3Smrg#define bswap_64(value) \ 119de2362d3Smrg (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 120de2362d3Smrg << 32) | \ 121de2362d3Smrg (uint64_t)bswap_32((uint32_t)((value) >> 32))) 122de2362d3Smrg#endif 123de2362d3Smrg 124de2362d3Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN 125de2362d3Smrg#define le32_to_cpu(x) bswap_32(x) 126de2362d3Smrg#define le16_to_cpu(x) bswap_16(x) 127de2362d3Smrg#define cpu_to_le32(x) bswap_32(x) 128de2362d3Smrg#define cpu_to_le16(x) bswap_16(x) 129de2362d3Smrg#else 130de2362d3Smrg#define le32_to_cpu(x) (x) 131de2362d3Smrg#define le16_to_cpu(x) (x) 132de2362d3Smrg#define cpu_to_le32(x) (x) 133de2362d3Smrg#define cpu_to_le16(x) (x) 134de2362d3Smrg#endif 135de2362d3Smrg 136de2362d3Smrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 137de2362d3Smrg#if !defined(__GNUC__) && !defined(__FUNCTION__) 138de2362d3Smrg# define __FUNCTION__ __func__ /* C99 */ 139de2362d3Smrg#endif 140de2362d3Smrg 141de2362d3Smrgtypedef enum { 142de2362d3Smrg OPTION_ACCEL, 143de2362d3Smrg OPTION_SW_CURSOR, 144de2362d3Smrg OPTION_PAGE_FLIP, 145de2362d3Smrg OPTION_EXA_PIXMAPS, 146de2362d3Smrg OPTION_COLOR_TILING, 147de2362d3Smrg OPTION_COLOR_TILING_2D, 148de2362d3Smrg#ifdef RENDER 149de2362d3Smrg OPTION_RENDER_ACCEL, 150de2362d3Smrg OPTION_SUBPIXEL_ORDER, 151de2362d3Smrg#endif 152de2362d3Smrg OPTION_ACCELMETHOD, 153de2362d3Smrg OPTION_EXA_VSYNC, 154de2362d3Smrg OPTION_ZAPHOD_HEADS, 1550d16fef4Smrg OPTION_SWAPBUFFERS_WAIT, 1560d16fef4Smrg OPTION_DELETE_DP12, 1570d16fef4Smrg OPTION_DRI3, 1580d16fef4Smrg OPTION_DRI, 1590d16fef4Smrg OPTION_SHADOW_PRIMARY, 1600d16fef4Smrg OPTION_TEAR_FREE, 161de2362d3Smrg} RADEONOpts; 162de2362d3Smrg 163de2362d3Smrg 1640d16fef4Smrg#if XF86_CRTC_VERSION >= 5 1650d16fef4Smrg#define RADEON_PIXMAP_SHARING 1 1660d16fef4Smrg#endif 1670d16fef4Smrg 168de2362d3Smrg#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 169de2362d3Smrg 170de2362d3Smrg/* Buffer are aligned on 4096 byte boundaries */ 171de2362d3Smrg#define RADEON_GPU_PAGE_SIZE 4096 172de2362d3Smrg#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1) 173de2362d3Smrg 174de2362d3Smrg 175de2362d3Smrg#define xFixedToFloat(f) (((float) (f)) / 65536) 176de2362d3Smrg 177de2362d3Smrg#define RADEON_LOGLEVEL_DEBUG 4 178de2362d3Smrg 179de2362d3Smrg/* for Xv, outputs */ 180de2362d3Smrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 181de2362d3Smrg 182de2362d3Smrg/* Other macros */ 183de2362d3Smrg#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 184de2362d3Smrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 185de2362d3Smrg#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 186de2362d3Smrg 187de2362d3Smrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 188de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV200) || \ 189de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS100) || \ 190de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS200) || \ 191de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV250) || \ 192de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 193de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS300)) 194de2362d3Smrg 195de2362d3Smrg 196de2362d3Smrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 197de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 198de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 199de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 200de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 201de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 202de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 203de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS480)) 204de2362d3Smrg 205de2362d3Smrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 206de2362d3Smrg 207de2362d3Smrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 208de2362d3Smrg 209de2362d3Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) 210de2362d3Smrg 211de2362d3Smrg#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR)) 212de2362d3Smrg 213de2362d3Smrg#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM)) 214de2362d3Smrg 215de2362d3Smrg#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS)) 216de2362d3Smrg 217de2362d3Smrg#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR) 218de2362d3Smrg 219de2362d3Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) 220de2362d3Smrg 221de2362d3Smrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 222de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R520) || \ 223de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV530) || \ 224de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R580) || \ 225de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV560) || \ 226de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV570)) 227de2362d3Smrg 228de2362d3Smrg/* RS6xx, RS740 are technically R4xx as well, but the 229de2362d3Smrg * clipping hardware seems to follow the r3xx restrictions 230de2362d3Smrg */ 231de2362d3Smrg#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420) || \ 232de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV410)) 233de2362d3Smrg 234de2362d3Smrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 235de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 236de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 237de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 238de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 239de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 240de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 241de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 242de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS740) || \ 243de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 244de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS480)) 245de2362d3Smrg 246de2362d3Smrg#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \ 247de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 248de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS300) || \ 249de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R200)) 250de2362d3Smrg 251de2362d3Smrg#define CURSOR_WIDTH 64 252de2362d3Smrg#define CURSOR_HEIGHT 64 253de2362d3Smrg 254de2362d3Smrg#define CURSOR_WIDTH_CIK 128 255de2362d3Smrg#define CURSOR_HEIGHT_CIK 128 256de2362d3Smrg 2570d16fef4Smrg 2580d16fef4Smrg#ifdef USE_GLAMOR 2590d16fef4Smrg 2600d16fef4Smrgstruct radeon_pixmap { 2610d16fef4Smrg struct radeon_surface surface; 2620d16fef4Smrg 2630d16fef4Smrg uint_fast32_t gpu_read; 2640d16fef4Smrg uint_fast32_t gpu_write; 2650d16fef4Smrg 2660d16fef4Smrg struct radeon_bo *bo; 2670d16fef4Smrg 2680d16fef4Smrg uint32_t tiling_flags; 2690d16fef4Smrg 2700d16fef4Smrg /* GEM handle for glamor-only pixmaps shared via DRI3 */ 2710d16fef4Smrg Bool handle_valid; 2720d16fef4Smrg uint32_t handle; 2730d16fef4Smrg}; 2740d16fef4Smrg 2750d16fef4Smrgextern DevPrivateKeyRec glamor_pixmap_index; 2760d16fef4Smrg 2770d16fef4Smrgstatic inline struct radeon_pixmap *radeon_get_pixmap_private(PixmapPtr pixmap) 2780d16fef4Smrg{ 2790d16fef4Smrg return dixGetPrivate(&pixmap->devPrivates, &glamor_pixmap_index); 2800d16fef4Smrg} 2810d16fef4Smrg 2820d16fef4Smrgstatic inline void radeon_set_pixmap_private(PixmapPtr pixmap, struct radeon_pixmap *priv) 2830d16fef4Smrg{ 2840d16fef4Smrg dixSetPrivate(&pixmap->devPrivates, &glamor_pixmap_index, priv); 2850d16fef4Smrg} 2860d16fef4Smrg 2870d16fef4Smrg#endif /* USE_GLAMOR */ 2880d16fef4Smrg 2890d16fef4Smrg 290de2362d3Smrgstruct radeon_exa_pixmap_priv { 291de2362d3Smrg struct radeon_bo *bo; 292de2362d3Smrg uint32_t tiling_flags; 293de2362d3Smrg struct radeon_surface surface; 294de2362d3Smrg Bool bo_mapped; 295de2362d3Smrg Bool shared; 296de2362d3Smrg}; 297de2362d3Smrg 298de2362d3Smrg#define RADEON_2D_EXA_COPY 1 299de2362d3Smrg#define RADEON_2D_EXA_SOLID 2 300de2362d3Smrg 301de2362d3Smrgstruct radeon_2d_state { 302de2362d3Smrg int op; // 303de2362d3Smrg uint32_t dst_pitch_offset; 304de2362d3Smrg uint32_t src_pitch_offset; 305de2362d3Smrg uint32_t dp_gui_master_cntl; 306de2362d3Smrg uint32_t dp_cntl; 307de2362d3Smrg uint32_t dp_write_mask; 308de2362d3Smrg uint32_t dp_brush_frgd_clr; 309de2362d3Smrg uint32_t dp_brush_bkgd_clr; 310de2362d3Smrg uint32_t dp_src_frgd_clr; 311de2362d3Smrg uint32_t dp_src_bkgd_clr; 312de2362d3Smrg uint32_t default_sc_bottom_right; 313de2362d3Smrg uint32_t dst_domain; 314de2362d3Smrg struct radeon_bo *dst_bo; 315de2362d3Smrg struct radeon_bo *src_bo; 316de2362d3Smrg}; 317de2362d3Smrg 318de2362d3Smrg#define DMA_BO_FREE_TIME 1000 319de2362d3Smrg 320de2362d3Smrgstruct radeon_dma_bo { 321de2362d3Smrg struct radeon_dma_bo *next, *prev; 322de2362d3Smrg struct radeon_bo *bo; 323de2362d3Smrg int expire_counter; 324de2362d3Smrg}; 325de2362d3Smrg 326de2362d3Smrgstruct r600_accel_object { 327de2362d3Smrg uint32_t pitch; 328de2362d3Smrg uint32_t width; 329de2362d3Smrg uint32_t height; 330de2362d3Smrg int bpp; 331de2362d3Smrg uint32_t domain; 332de2362d3Smrg struct radeon_bo *bo; 333de2362d3Smrg uint32_t tiling_flags; 334de2362d3Smrg struct radeon_surface *surface; 335de2362d3Smrg}; 336de2362d3Smrg 337de2362d3Smrgstruct radeon_vbo_object { 338de2362d3Smrg int vb_offset; 339de2362d3Smrg int vb_total; 340de2362d3Smrg uint32_t vb_size; 341de2362d3Smrg uint32_t vb_op_vert_size; 342de2362d3Smrg int32_t vb_start_op; 343de2362d3Smrg struct radeon_bo *vb_bo; 344de2362d3Smrg unsigned verts_per_op; 345de2362d3Smrg}; 346de2362d3Smrg 347de2362d3Smrgstruct radeon_accel_state { 348de2362d3Smrg 349de2362d3Smrg /* Saved values for ScreenToScreenCopy */ 350de2362d3Smrg int xdir; 351de2362d3Smrg int ydir; 352de2362d3Smrg 353de2362d3Smrg /* render accel */ 354de2362d3Smrg unsigned short texW[2]; 355de2362d3Smrg unsigned short texH[2]; 356de2362d3Smrg Bool XInited3D; /* X itself has the 3D context */ 357de2362d3Smrg int num_gb_pipes; 358de2362d3Smrg Bool has_tcl; 359de2362d3Smrg Bool allowHWDFS; 360de2362d3Smrg 361de2362d3Smrg /* EXA */ 362de2362d3Smrg ExaDriverPtr exa; 363de2362d3Smrg int exaSyncMarker; 364de2362d3Smrg int exaMarkerSynced; 365de2362d3Smrg int engineMode; 366de2362d3Smrg#define EXA_ENGINEMODE_UNKNOWN 0 367de2362d3Smrg#define EXA_ENGINEMODE_2D 1 368de2362d3Smrg#define EXA_ENGINEMODE_3D 2 369de2362d3Smrg 370de2362d3Smrg int composite_op; 371de2362d3Smrg PicturePtr dst_pic; 372de2362d3Smrg PicturePtr msk_pic; 373de2362d3Smrg PicturePtr src_pic; 374de2362d3Smrg PixmapPtr dst_pix; 375de2362d3Smrg PixmapPtr msk_pix; 376de2362d3Smrg PixmapPtr src_pix; 377de2362d3Smrg Bool is_transform[2]; 378de2362d3Smrg PictTransform *transform[2]; 379de2362d3Smrg /* Whether we are tiling horizontally and vertically */ 380de2362d3Smrg Bool need_src_tile_x; 381de2362d3Smrg Bool need_src_tile_y; 382de2362d3Smrg /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ 383de2362d3Smrg Bool src_tile_width; 384de2362d3Smrg Bool src_tile_height; 385de2362d3Smrg uint32_t *draw_header; 386de2362d3Smrg unsigned vtx_count; 387de2362d3Smrg unsigned num_vtx; 388de2362d3Smrg Bool vsync; 389de2362d3Smrg 390de2362d3Smrg struct radeon_vbo_object vbo; 391de2362d3Smrg struct radeon_vbo_object cbuf; 392de2362d3Smrg 393de2362d3Smrg /* where to discard IB from if we cancel operation */ 394de2362d3Smrg uint32_t ib_reset_op; 395de2362d3Smrg struct radeon_dma_bo bo_free; 396de2362d3Smrg struct radeon_dma_bo bo_wait; 397de2362d3Smrg struct radeon_dma_bo bo_reserved; 398de2362d3Smrg Bool use_vbos; 399de2362d3Smrg void (*finish_op)(ScrnInfoPtr, int); 400de2362d3Smrg // shader storage 401de2362d3Smrg struct radeon_bo *shaders_bo; 402de2362d3Smrg uint32_t solid_vs_offset; 403de2362d3Smrg uint32_t solid_ps_offset; 404de2362d3Smrg uint32_t copy_vs_offset; 405de2362d3Smrg uint32_t copy_ps_offset; 406de2362d3Smrg uint32_t comp_vs_offset; 407de2362d3Smrg uint32_t comp_ps_offset; 408de2362d3Smrg uint32_t xv_vs_offset; 409de2362d3Smrg uint32_t xv_ps_offset; 410de2362d3Smrg // shader consts 411de2362d3Smrg uint32_t solid_vs_const_offset; 412de2362d3Smrg uint32_t solid_ps_const_offset; 413de2362d3Smrg uint32_t copy_vs_const_offset; 414de2362d3Smrg uint32_t copy_ps_const_offset; 415de2362d3Smrg uint32_t comp_vs_const_offset; 416de2362d3Smrg uint32_t comp_ps_const_offset; 417de2362d3Smrg uint32_t comp_mask_ps_const_offset; 418de2362d3Smrg uint32_t xv_vs_const_offset; 419de2362d3Smrg uint32_t xv_ps_const_offset; 420de2362d3Smrg 421de2362d3Smrg //size/addr stuff 422de2362d3Smrg struct r600_accel_object src_obj[2]; 423de2362d3Smrg struct r600_accel_object dst_obj; 424de2362d3Smrg uint32_t src_size[2]; 425de2362d3Smrg uint32_t dst_size; 426de2362d3Smrg 427de2362d3Smrg uint32_t vs_size; 428de2362d3Smrg uint64_t vs_mc_addr; 429de2362d3Smrg uint32_t ps_size; 430de2362d3Smrg uint64_t ps_mc_addr; 431de2362d3Smrg 432de2362d3Smrg // solid/copy 433de2362d3Smrg void *copy_area; 434de2362d3Smrg struct radeon_bo *copy_area_bo; 435de2362d3Smrg Bool same_surface; 436de2362d3Smrg int rop; 437de2362d3Smrg uint32_t planemask; 438de2362d3Smrg uint32_t fg; 439de2362d3Smrg 440de2362d3Smrg // composite 441de2362d3Smrg Bool component_alpha; 442de2362d3Smrg Bool src_alpha; 443de2362d3Smrg // vline 444de2362d3Smrg xf86CrtcPtr vline_crtc; 445de2362d3Smrg int vline_y1; 446de2362d3Smrg int vline_y2; 447de2362d3Smrg 448de2362d3Smrg Bool force; 449de2362d3Smrg}; 450de2362d3Smrg 451de2362d3Smrgtypedef struct { 452de2362d3Smrg EntityInfoPtr pEnt; 453de2362d3Smrg pciVideoPtr PciInfo; 454de2362d3Smrg int Chipset; 455de2362d3Smrg RADEONChipFamily ChipFamily; 456de2362d3Smrg 457de2362d3Smrg Bool (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL); 458de2362d3Smrg 459de2362d3Smrg void (*BlockHandler)(BLOCKHANDLER_ARGS_DECL); 460de2362d3Smrg 4610d16fef4Smrg void (*CreateFence) (ScreenPtr pScreen, struct _SyncFence *pFence, 4620d16fef4Smrg Bool initially_triggered); 4630d16fef4Smrg 464de2362d3Smrg int pix24bpp; /* Depth of pixmap for 24bpp fb */ 465de2362d3Smrg Bool dac6bits; /* Use 6 bit DAC? */ 466de2362d3Smrg 467de2362d3Smrg int pixel_bytes; 468de2362d3Smrg 469de2362d3Smrg Bool directRenderingEnabled; 470de2362d3Smrg struct radeon_dri2 dri2; 471de2362d3Smrg 472de2362d3Smrg /* accel */ 473de2362d3Smrg Bool RenderAccel; /* Render */ 474de2362d3Smrg Bool allowColorTiling; 475de2362d3Smrg Bool allowColorTiling2D; 4760d16fef4Smrg uint_fast32_t gpu_flushed; 4770d16fef4Smrg uint_fast32_t gpu_synced; 478de2362d3Smrg struct radeon_accel_state *accel_state; 4790d16fef4Smrg PixmapPtr fbcon_pixmap; 480de2362d3Smrg Bool accelOn; 481de2362d3Smrg Bool use_glamor; 4820d16fef4Smrg Bool shadow_primary; 4830d16fef4Smrg Bool tear_free; 484de2362d3Smrg Bool exa_pixmaps; 485de2362d3Smrg Bool exa_force_create; 486de2362d3Smrg XF86ModReqInfo exaReq; 487de2362d3Smrg Bool is_fast_fb; /* use direct mapping for fast fb access */ 488de2362d3Smrg 489de2362d3Smrg unsigned int xv_max_width; 490de2362d3Smrg unsigned int xv_max_height; 491de2362d3Smrg 492de2362d3Smrg /* general */ 493de2362d3Smrg OptionInfoPtr Options; 494de2362d3Smrg 495de2362d3Smrg DisplayModePtr currentMode; 496de2362d3Smrg 497de2362d3Smrg CreateScreenResourcesProcPtr CreateScreenResources; 4980d16fef4Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10 4990d16fef4Smrg CreateWindowProcPtr CreateWindow; 5000d16fef4Smrg#endif 501de2362d3Smrg 502de2362d3Smrg Bool IsSecondary; 503de2362d3Smrg 504de2362d3Smrg Bool r600_shadow_fb; 505de2362d3Smrg void *fb_shadow; 506de2362d3Smrg 507de2362d3Smrg void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB 508de2362d3Smrg struct radeon_2d_state state_2d; 509de2362d3Smrg struct radeon_bo *front_bo; 510de2362d3Smrg struct radeon_bo_manager *bufmgr; 511de2362d3Smrg struct radeon_cs_manager *csm; 512de2362d3Smrg struct radeon_cs *cs; 513de2362d3Smrg 514de2362d3Smrg struct radeon_bo *cursor_bo[32]; 515de2362d3Smrg uint64_t vram_size; 516de2362d3Smrg uint64_t gart_size; 517de2362d3Smrg drmmode_rec drmmode; 518de2362d3Smrg Bool drmmode_inited; 519de2362d3Smrg /* r6xx+ tile config */ 520de2362d3Smrg Bool have_tiling_info; 521de2362d3Smrg uint32_t tile_config; 522de2362d3Smrg int group_bytes; 523de2362d3Smrg int num_channels; 524de2362d3Smrg int num_banks; 525de2362d3Smrg int r7xx_bank_op; 526de2362d3Smrg struct radeon_surface_manager *surf_man; 527de2362d3Smrg struct radeon_surface front_surface; 528de2362d3Smrg 529de2362d3Smrg /* Xv bicubic filtering */ 530de2362d3Smrg struct radeon_bo *bicubic_bo; 531de2362d3Smrg 532de2362d3Smrg /* kms pageflipping */ 533de2362d3Smrg Bool allowPageFlip; 534de2362d3Smrg 535de2362d3Smrg /* Perform vsync'ed SwapBuffers? */ 536de2362d3Smrg Bool swapBuffersWait; 537de2362d3Smrg 538de2362d3Smrg /* cursor size */ 539de2362d3Smrg int cursor_w; 540de2362d3Smrg int cursor_h; 5410d16fef4Smrg 5420d16fef4Smrg /* If bit n of this field is set, xf86_config->crtc[n] currently can't 5430d16fef4Smrg * use the HW cursor 5440d16fef4Smrg */ 5450d16fef4Smrg unsigned hwcursor_disabled; 5460d16fef4Smrg 5470d16fef4Smrg#ifdef USE_GLAMOR 5480d16fef4Smrg struct { 5490d16fef4Smrg CreateGCProcPtr SavedCreateGC; 5500d16fef4Smrg RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, int, int, 5510d16fef4Smrg int, int, int, int); 5520d16fef4Smrg void (*SavedPolyFillRect)(DrawablePtr, GCPtr, int, xRectangle*); 5530d16fef4Smrg CloseScreenProcPtr SavedCloseScreen; 5540d16fef4Smrg GetImageProcPtr SavedGetImage; 5550d16fef4Smrg GetSpansProcPtr SavedGetSpans; 5560d16fef4Smrg CreatePixmapProcPtr SavedCreatePixmap; 5570d16fef4Smrg DestroyPixmapProcPtr SavedDestroyPixmap; 5580d16fef4Smrg CopyWindowProcPtr SavedCopyWindow; 5590d16fef4Smrg ChangeWindowAttributesProcPtr SavedChangeWindowAttributes; 5600d16fef4Smrg BitmapToRegionProcPtr SavedBitmapToRegion; 5610d16fef4Smrg#ifdef RENDER 5620d16fef4Smrg CompositeProcPtr SavedComposite; 5630d16fef4Smrg TrianglesProcPtr SavedTriangles; 5640d16fef4Smrg GlyphsProcPtr SavedGlyphs; 5650d16fef4Smrg TrapezoidsProcPtr SavedTrapezoids; 5660d16fef4Smrg AddTrapsProcPtr SavedAddTraps; 5670d16fef4Smrg UnrealizeGlyphProcPtr SavedUnrealizeGlyph; 5680d16fef4Smrg#endif 5690d16fef4Smrg#ifdef RADEON_PIXMAP_SHARING 5700d16fef4Smrg SharePixmapBackingProcPtr SavedSharePixmapBacking; 5710d16fef4Smrg SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking; 5720d16fef4Smrg#endif 5730d16fef4Smrg } glamor; 5740d16fef4Smrg#endif /* USE_GLAMOR */ 575de2362d3Smrg} RADEONInfoRec, *RADEONInfoPtr; 576de2362d3Smrg 577de2362d3Smrg/* radeon_accel.c */ 578de2362d3Smrgextern Bool RADEONAccelInit(ScreenPtr pScreen); 579de2362d3Smrgextern void RADEONEngineInit(ScrnInfoPtr pScrn); 580de2362d3Smrgextern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 581de2362d3Smrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 582de2362d3Smrgextern int radeon_cs_space_remaining(ScrnInfoPtr pScrn); 583de2362d3Smrg 584de2362d3Smrg/* radeon_commonfuncs.c */ 585de2362d3Smrgextern void RADEONWaitForVLine(ScrnInfoPtr pScrn, PixmapPtr pPix, 586de2362d3Smrg xf86CrtcPtr crtc, int start, int stop); 587de2362d3Smrg 588de2362d3Smrg 589de2362d3Smrg/* radeon_exa.c */ 590de2362d3Smrgextern unsigned eg_tile_split(unsigned tile_split); 591de2362d3Smrgextern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t); 592de2362d3Smrg 593de2362d3Smrg/* radeon_exa_funcs.c */ 594de2362d3Smrgextern Bool RADEONDrawInit(ScreenPtr pScreen); 595de2362d3Smrgextern Bool R600DrawInit(ScreenPtr pScreen); 596de2362d3Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn); 597de2362d3Smrgextern Bool EVERGREENDrawInit(ScreenPtr pScreen); 598de2362d3Smrg 599de2362d3Smrg/* radeon_exa.c */ 600de2362d3Smrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 601de2362d3Smrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 602de2362d3Smrg uint32_t *pitch_offset); 603de2362d3Smrg 6040d16fef4Smrg/* radeon_dri3.c */ 6050d16fef4SmrgBool radeon_dri3_screen_init(ScreenPtr screen); 6060d16fef4Smrg 6070d16fef4Smrg/* radeon_kms.c */ 6080d16fef4Smrgvoid radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, 6090d16fef4Smrg uint64_t usec, void *event_data); 6100d16fef4Smrg 6110d16fef4Smrg/* radeon_present.c */ 6120d16fef4SmrgBool radeon_present_screen_init(ScreenPtr screen); 6130d16fef4Smrg 6140d16fef4Smrg/* radeon_sync.c */ 6150d16fef4Smrgextern Bool radeon_sync_init(ScreenPtr screen); 6160d16fef4Smrgextern void radeon_sync_close(ScreenPtr screen); 6170d16fef4Smrg 618de2362d3Smrg/* radeon_video.c */ 619de2362d3Smrgextern void RADEONInitVideo(ScreenPtr pScreen); 620de2362d3Smrgextern void RADEONResetVideo(ScrnInfoPtr pScrn); 621de2362d3Smrgextern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn); 622de2362d3Smrgextern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn, 623de2362d3Smrg Bool consider_disabled, 624de2362d3Smrg int x1, int x2, int y1, int y2); 625de2362d3Smrg 626de2362d3Smrgextern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn); 627de2362d3Smrgextern void radeon_ddx_cs_start(ScrnInfoPtr pScrn, 628de2362d3Smrg int num, const char *file, 629de2362d3Smrg const char *func, int line); 630de2362d3Smrgvoid radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, uint32_t new_fb_size); 631de2362d3Smrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 632de2362d3Smrg 633de2362d3SmrgdrmVBlankSeqType radeon_populate_vbl_request_type(xf86CrtcPtr crtc); 634de2362d3Smrg 635de2362d3Smrgstatic inline struct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix) 636de2362d3Smrg{ 637de2362d3Smrg#ifdef USE_GLAMOR 638de2362d3Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 639de2362d3Smrg 640de2362d3Smrg if (info->use_glamor) { 641de2362d3Smrg struct radeon_pixmap *priv; 642de2362d3Smrg priv = radeon_get_pixmap_private(pPix); 643de2362d3Smrg return priv ? &priv->surface : NULL; 644de2362d3Smrg } else 645de2362d3Smrg#endif 646de2362d3Smrg { 647de2362d3Smrg struct radeon_exa_pixmap_priv *driver_priv; 648de2362d3Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 649de2362d3Smrg return &driver_priv->surface; 650de2362d3Smrg } 651de2362d3Smrg 652de2362d3Smrg return NULL; 653de2362d3Smrg} 654de2362d3Smrg 655de2362d3Smrguint32_t radeon_get_pixmap_tiling(PixmapPtr pPix); 656de2362d3Smrg 657de2362d3Smrgstatic inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo) 658de2362d3Smrg{ 6590d16fef4Smrg ScreenPtr pScreen = pPix->drawable.pScreen; 6600d16fef4Smrg 661de2362d3Smrg#ifdef USE_GLAMOR 662de2362d3Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 663de2362d3Smrg 664de2362d3Smrg if (info->use_glamor) { 665de2362d3Smrg struct radeon_pixmap *priv; 666de2362d3Smrg 667de2362d3Smrg priv = radeon_get_pixmap_private(pPix); 668de2362d3Smrg if (priv == NULL && bo == NULL) 669de2362d3Smrg return; 670de2362d3Smrg 671de2362d3Smrg if (priv) { 672de2362d3Smrg if (priv->bo == bo) 673de2362d3Smrg return; 674de2362d3Smrg 675de2362d3Smrg if (priv->bo) 676de2362d3Smrg radeon_bo_unref(priv->bo); 677de2362d3Smrg 678de2362d3Smrg if (!bo) { 679de2362d3Smrg free(priv); 680de2362d3Smrg priv = NULL; 681de2362d3Smrg } 682de2362d3Smrg } 683de2362d3Smrg 684de2362d3Smrg if (bo) { 685de2362d3Smrg uint32_t pitch; 686de2362d3Smrg 687de2362d3Smrg if (!priv) { 688de2362d3Smrg priv = calloc(1, sizeof (struct radeon_pixmap)); 689de2362d3Smrg if (!priv) 690de2362d3Smrg goto out; 691de2362d3Smrg } 692de2362d3Smrg 693de2362d3Smrg radeon_bo_ref(bo); 694de2362d3Smrg priv->bo = bo; 695de2362d3Smrg 6960d16fef4Smrg if (radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch) == 0 && 6970d16fef4Smrg pitch != pPix->devKind) 6980d16fef4Smrg pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL); 699de2362d3Smrg } 700de2362d3Smrgout: 701de2362d3Smrg radeon_set_pixmap_private(pPix, priv); 702de2362d3Smrg } else 703de2362d3Smrg#endif /* USE_GLAMOR */ 704de2362d3Smrg { 705de2362d3Smrg struct radeon_exa_pixmap_priv *driver_priv; 706de2362d3Smrg 707de2362d3Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 708de2362d3Smrg if (driver_priv) { 709de2362d3Smrg uint32_t pitch; 710de2362d3Smrg 711de2362d3Smrg if (driver_priv->bo) 712de2362d3Smrg radeon_bo_unref(driver_priv->bo); 713de2362d3Smrg 714de2362d3Smrg radeon_bo_ref(bo); 715de2362d3Smrg driver_priv->bo = bo; 716de2362d3Smrg 7170d16fef4Smrg if (radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch) == 0 && 7180d16fef4Smrg pitch != pPix->devKind) 7190d16fef4Smrg pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL); 720de2362d3Smrg } 721de2362d3Smrg } 722de2362d3Smrg} 723de2362d3Smrg 724de2362d3Smrgstatic inline struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix) 725de2362d3Smrg{ 726de2362d3Smrg#ifdef USE_GLAMOR 727de2362d3Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 728de2362d3Smrg 729de2362d3Smrg if (info->use_glamor) { 730de2362d3Smrg struct radeon_pixmap *priv; 731de2362d3Smrg priv = radeon_get_pixmap_private(pPix); 732de2362d3Smrg return priv ? priv->bo : NULL; 733de2362d3Smrg } else 734de2362d3Smrg#endif 735de2362d3Smrg { 736de2362d3Smrg struct radeon_exa_pixmap_priv *driver_priv; 737de2362d3Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 7380d16fef4Smrg return driver_priv ? driver_priv->bo : NULL; 739de2362d3Smrg } 740de2362d3Smrg 741de2362d3Smrg return NULL; 742de2362d3Smrg} 743de2362d3Smrg 744de2362d3Smrgstatic inline Bool radeon_get_pixmap_shared(PixmapPtr pPix) 745de2362d3Smrg{ 746de2362d3Smrg#ifdef USE_GLAMOR 747de2362d3Smrg RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); 748de2362d3Smrg 749de2362d3Smrg if (info->use_glamor) { 750de2362d3Smrg ErrorF("glamor sharing todo\n"); 751de2362d3Smrg return FALSE; 752de2362d3Smrg } else 753de2362d3Smrg#endif 754de2362d3Smrg { 755de2362d3Smrg struct radeon_exa_pixmap_priv *driver_priv; 756de2362d3Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); 757de2362d3Smrg return driver_priv->shared; 758de2362d3Smrg } 759de2362d3Smrg return FALSE; 760de2362d3Smrg} 761de2362d3Smrg 762de2362d3Smrg#define CP_PACKET0(reg, n) \ 763de2362d3Smrg (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 764de2362d3Smrg#define CP_PACKET1(reg0, reg1) \ 765de2362d3Smrg (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 766de2362d3Smrg#define CP_PACKET2() \ 767de2362d3Smrg (RADEON_CP_PACKET2) 768de2362d3Smrg#define CP_PACKET3(pkt, n) \ 769de2362d3Smrg (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 770de2362d3Smrg 771de2362d3Smrg 772de2362d3Smrg#define RADEON_VERBOSE 0 773de2362d3Smrg 774de2362d3Smrg#define BEGIN_RING(n) do { \ 775de2362d3Smrg if (RADEON_VERBOSE) { \ 776de2362d3Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 777de2362d3Smrg "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 778de2362d3Smrg } \ 779de2362d3Smrg radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__); \ 780de2362d3Smrg} while (0) 781de2362d3Smrg 782de2362d3Smrg#define ADVANCE_RING() do { \ 783de2362d3Smrg radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ 784de2362d3Smrg } while (0) 785de2362d3Smrg 786de2362d3Smrg#define OUT_RING(x) do { \ 787de2362d3Smrg if (RADEON_VERBOSE) { \ 788de2362d3Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 789de2362d3Smrg " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 790de2362d3Smrg } \ 791de2362d3Smrg radeon_cs_write_dword(info->cs, (x)); \ 792de2362d3Smrg} while (0) 793de2362d3Smrg 794de2362d3Smrg#define OUT_RING_REG(reg, val) \ 795de2362d3Smrgdo { \ 796de2362d3Smrg OUT_RING(CP_PACKET0(reg, 0)); \ 797de2362d3Smrg OUT_RING(val); \ 798de2362d3Smrg} while (0) 799de2362d3Smrg 800de2362d3Smrg#define OUT_RING_RELOC(x, read_domains, write_domain) \ 801de2362d3Smrg do { \ 802de2362d3Smrg int _ret; \ 803de2362d3Smrg _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \ 804de2362d3Smrg if (_ret) ErrorF("reloc emit failure %d\n", _ret); \ 805de2362d3Smrg } while(0) 806de2362d3Smrg 807de2362d3Smrg 808de2362d3Smrg#define FLUSH_RING() \ 809de2362d3Smrgdo { \ 810de2362d3Smrg if (RADEON_VERBOSE) \ 811de2362d3Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 812de2362d3Smrg "FLUSH_RING in %s\n", __FUNCTION__); \ 813de2362d3Smrg radeon_cs_flush_indirect(pScrn); \ 814de2362d3Smrg} while (0) 815de2362d3Smrg 816de2362d3Smrg#define CS_FULL(cs) ((cs)->cdw > 15 * 1024) 817de2362d3Smrg 818de2362d3Smrg#define RADEON_SWITCH_TO_2D() \ 819de2362d3Smrgdo { \ 820de2362d3Smrg uint32_t flush = 0; \ 821de2362d3Smrg switch (info->accel_state->engineMode) { \ 822de2362d3Smrg case EXA_ENGINEMODE_UNKNOWN: \ 823de2362d3Smrg flush = 1; \ 824de2362d3Smrg break; \ 825de2362d3Smrg case EXA_ENGINEMODE_3D: \ 826de2362d3Smrg flush = CS_FULL(info->cs); \ 827de2362d3Smrg break; \ 828de2362d3Smrg case EXA_ENGINEMODE_2D: \ 829de2362d3Smrg flush = CS_FULL(info->cs); \ 830de2362d3Smrg break; \ 831de2362d3Smrg } \ 832de2362d3Smrg if (flush) { \ 833de2362d3Smrg radeon_cs_flush_indirect(pScrn); \ 834de2362d3Smrg } \ 835de2362d3Smrg info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ 836de2362d3Smrg} while (0); 837de2362d3Smrg 838de2362d3Smrg#define RADEON_SWITCH_TO_3D() \ 839de2362d3Smrgdo { \ 840de2362d3Smrg uint32_t flush = 0; \ 841de2362d3Smrg switch (info->accel_state->engineMode) { \ 842de2362d3Smrg case EXA_ENGINEMODE_UNKNOWN: \ 843de2362d3Smrg flush = 1; \ 844de2362d3Smrg break; \ 845de2362d3Smrg case EXA_ENGINEMODE_2D: \ 846de2362d3Smrg flush = CS_FULL(info->cs); \ 847de2362d3Smrg break; \ 848de2362d3Smrg case EXA_ENGINEMODE_3D: \ 849de2362d3Smrg flush = CS_FULL(info->cs); \ 850de2362d3Smrg break; \ 851de2362d3Smrg } \ 852de2362d3Smrg if (flush) { \ 853de2362d3Smrg radeon_cs_flush_indirect(pScrn); \ 854de2362d3Smrg } \ 855de2362d3Smrg if (!info->accel_state->XInited3D) \ 856de2362d3Smrg RADEONInit3DEngine(pScrn); \ 857de2362d3Smrg info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ 858de2362d3Smrg} while (0); 859de2362d3Smrg 860de2362d3Smrg /* Memory mapped register access macros */ 861de2362d3Smrg 862de2362d3Smrg#define BEGIN_ACCEL_RELOC(n, r) do { \ 863de2362d3Smrg int _nqw = (n) + (r); \ 864de2362d3Smrg BEGIN_RING(2*_nqw); \ 865de2362d3Smrg } while (0) 866de2362d3Smrg 867de2362d3Smrg#define EMIT_OFFSET(reg, value, pPix, rd, wd) do { \ 868de2362d3Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); \ 869de2362d3Smrg OUT_RING_REG((reg), (value)); \ 870de2362d3Smrg OUT_RING_RELOC(driver_priv->bo, (rd), (wd)); \ 871de2362d3Smrg } while(0) 872de2362d3Smrg 873de2362d3Smrg#define EMIT_READ_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT), 0) 874de2362d3Smrg#define EMIT_WRITE_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, 0, RADEON_GEM_DOMAIN_VRAM) 875de2362d3Smrg 876de2362d3Smrg#define OUT_TEXTURE_REG(reg, offset, bo) do { \ 877de2362d3Smrg OUT_RING_REG((reg), (offset)); \ 878de2362d3Smrg OUT_RING_RELOC((bo), RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); \ 879de2362d3Smrg } while(0) 880de2362d3Smrg 881de2362d3Smrg#define EMIT_COLORPITCH(reg, value, pPix) do { \ 882de2362d3Smrg driver_priv = exaGetPixmapDriverPrivate(pPix); \ 883de2362d3Smrg OUT_RING_REG((reg), value); \ 884de2362d3Smrg OUT_RING_RELOC(driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); \ 885de2362d3Smrg} while(0) 886de2362d3Smrg 887de2362d3Smrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 888de2362d3Smrg{ 889de2362d3Smrg if (pScrn->pScreen) 890de2362d3Smrg exaWaitSync(pScrn->pScreen); 891de2362d3Smrg} 892de2362d3Smrg 893de2362d3Smrgenum { 8940d16fef4Smrg RADEON_CREATE_PIXMAP_SCANOUT = 0x02000000, 895de2362d3Smrg RADEON_CREATE_PIXMAP_DRI2 = 0x04000000, 896de2362d3Smrg RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE = 0x08000000, 897de2362d3Smrg RADEON_CREATE_PIXMAP_TILING_MACRO = 0x10000000, 898de2362d3Smrg RADEON_CREATE_PIXMAP_TILING_MICRO = 0x20000000, 899de2362d3Smrg RADEON_CREATE_PIXMAP_DEPTH = 0x40000000, /* for r200 */ 900de2362d3Smrg RADEON_CREATE_PIXMAP_SZBUFFER = 0x80000000, /* for eg */ 901de2362d3Smrg}; 902de2362d3Smrg 903de2362d3Smrg#define RADEON_CREATE_PIXMAP_TILING_FLAGS \ 904de2362d3Smrg (RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE | \ 905de2362d3Smrg RADEON_CREATE_PIXMAP_TILING_MACRO | \ 906de2362d3Smrg RADEON_CREATE_PIXMAP_TILING_MICRO | \ 907de2362d3Smrg RADEON_CREATE_PIXMAP_DEPTH | \ 908de2362d3Smrg RADEON_CREATE_PIXMAP_SZBUFFER) 909de2362d3Smrg 910de2362d3Smrg 911de2362d3Smrg/* Compute log base 2 of val. */ 912de2362d3Smrgstatic __inline__ int 913de2362d3SmrgRADEONLog2(int val) 914de2362d3Smrg{ 915de2362d3Smrg int bits; 916de2362d3Smrg#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__) 917de2362d3Smrg __asm volatile("bsrl %1, %0" 918de2362d3Smrg : "=r" (bits) 919de2362d3Smrg : "c" (val) 920de2362d3Smrg ); 921de2362d3Smrg return bits; 922de2362d3Smrg#else 923de2362d3Smrg for (bits = 0; val != 0; val >>= 1, ++bits) 924de2362d3Smrg ; 925de2362d3Smrg return bits - 1; 926de2362d3Smrg#endif 927de2362d3Smrg} 928de2362d3Smrg 929de2362d3Smrg#define RADEON_TILING_MASK 0xff 930de2362d3Smrg#define RADEON_TILING_LINEAR 0x0 931de2362d3Smrg 932de2362d3Smrg#endif /* _RADEON_H_ */ 933