intel_regions.c revision 733d32f3765be84a7e908df7e99a278cadcee853
1554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/************************************************************************** 2554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * 3554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas. 4554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * All Rights Reserved. 5554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * 6554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * Permission is hereby granted, free of charge, to any person obtaining a 7554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * copy of this software and associated documentation files (the 8554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * "Software"), to deal in the Software without restriction, including 9554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * without limitation the rights to use, copy, modify, merge, publish, 10554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * distribute, sub license, and/or sell copies of the Software, and to 11554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * permit persons to whom the Software is furnished to do so, subject to 12554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * the following conditions: 13554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * 14554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * The above copyright notice and this permission notice (including the 15554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * next paragraph) shall be included in all copies or substantial portions 16554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * of the Software. 17554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * 18554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * 26554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka **************************************************************************/ 27554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 28554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/* Provide additional functionality on top of bufmgr buffers: 29554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * - 2d semantics and blit operations 30554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * - refcounting of buffers for multiple images in a buffer. 31554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * - refcounting of buffer mappings. 32554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * - some logic for moving the buffers to the best memory pools for 33554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * given operations. 34554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * 35554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * Most of this is to make it easier to implement the fixed-layout 36554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * mipmap tree required by intel hardware in the face of GL's 37554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * programming interface where each image can be specifed in random 38a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler * order and it isn't clear what layout the tree should have until the 39a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler * last moment. 40a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler */ 41a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler 42a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler#include <sys/ioctl.h> 43554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include <errno.h> 44a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka 45a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "main/hash.h" 46a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "intel_context.h" 47a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "intel_regions.h" 48a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "intel_blit.h" 49a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "intel_buffer_objects.h" 50a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "intel_bufmgr.h" 51a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include "intel_batchbuffer.h" 52a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka 53a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#define FILE_DEBUG_FLAG DEBUG_REGION 54a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka 55a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka/* This should be set to the maximum backtrace size desired. 56a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka * Set it to 0 to disable backtrace debugging. 57a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka */ 58a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#define DEBUG_BACKTRACE_SIZE 0 59a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka 60a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#if DEBUG_BACKTRACE_SIZE == 0 61a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka/* Use the standard debug output */ 62a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#define _DBG(...) DBG(__VA_ARGS__) 63a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#else 64a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka/* Use backtracing debug output */ 65a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#define _DBG(...) {debug_backtrace(); DBG(__VA_ARGS__);} 66a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka 67a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka/* Backtracing debug support */ 68a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka#include <execinfo.h> 69a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders 70a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sandersstatic void 71a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sandersdebug_backtrace(void) 72a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders{ 73a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders void *trace[DEBUG_BACKTRACE_SIZE]; 74a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders char **strings = NULL; 75a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders int traceSize; 76a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders register int i; 77a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders 78a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders traceSize = backtrace(trace, DEBUG_BACKTRACE_SIZE); 79a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders strings = backtrace_symbols(trace, traceSize); 80a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders if (strings == NULL) { 81a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders DBG("no backtrace:"); 82a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders return; 83a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders } 84f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka 85554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /* Spit out all the strings with a colon separator. Ignore 86554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * the first, since we don't really care about the call 87554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * to debug_backtrace() itself. Skip until the final "/" in 88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * the trace to avoid really long lines. 89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka */ 90554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (i = 1; i < traceSize; i++) { 91554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka char *p = strings[i], *slash = strings[i]; 92554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka while (*p) { 93554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (*p++ == '/') { 94554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka slash = p; 95554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 96554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 97554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 98554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DBG("%s:", slash); 99554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 100554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 101554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /* Free up the memory, and we're done */ 102554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka free(strings); 103554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 104554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#endif 106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 107554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakastatic struct intel_region * 108554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_alloc_internal(struct intel_screen *screen, 109554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint cpp, 110554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint width, GLuint height, GLuint pitch, 111554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka uint32_t tiling, drm_intel_bo *buffer) 112554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 113554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka struct intel_region *region; 114554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 115554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region = calloc(sizeof(*region), 1); 116554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (region == NULL) 117554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return region; 118554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 119554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->cpp = cpp; 120554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->width = width; 121554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->height = height; 122f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka region->pitch = pitch; 123554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->refcount = 1; 124554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->bo = buffer; 125554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->tiling = tiling; 126554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 127554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka _DBG("%s <-- %p\n", __FUNCTION__, region); 128554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return region; 129554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 130554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 131554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakastruct intel_region * 132554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_alloc(struct intel_screen *screen, 133554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka uint32_t tiling, 134554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint cpp, GLuint width, GLuint height, 135554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka bool expect_accelerated_upload) 136554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 1371858786285139b87961d9ca08de91dcd59364afbAkira Hatanaka drm_intel_bo *buffer; 138554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned long flags = 0; 1391858786285139b87961d9ca08de91dcd59364afbAkira Hatanaka unsigned long aligned_pitch; 140554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka struct intel_region *region; 141554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 142554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (expect_accelerated_upload) 143554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka flags |= BO_ALLOC_FOR_RENDER; 144554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 145554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "region", 146554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka width, height, cpp, 147554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka &tiling, &aligned_pitch, flags); 148554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (buffer == NULL) 149554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return NULL; 150554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 151554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region = intel_region_alloc_internal(screen, cpp, width, height, 152554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka aligned_pitch, tiling, buffer); 153554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (region == NULL) { 154554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka drm_intel_bo_unreference(buffer); 155554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return NULL; 156554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 157554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 158554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return region; 159554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 160554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 161554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool 162554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_flink(struct intel_region *region, uint32_t *name) 163554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 164554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (region->name == 0) { 165554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (drm_intel_bo_flink(region->bo, ®ion->name)) 166554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 167554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 168554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 169554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *name = region->name; 170554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 171554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 172554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 173554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 174554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakastruct intel_region * 175554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_alloc_for_handle(struct intel_screen *screen, 176554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint cpp, 177554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint width, GLuint height, GLuint pitch, 178554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint handle, const char *name) 179554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 180554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka struct intel_region *region; 181554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka drm_intel_bo *buffer; 182554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka int ret; 183554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka uint32_t bit_6_swizzle, tiling; 184554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 185554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka buffer = intel_bo_gem_create_from_name(screen->bufmgr, name, handle); 186554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (buffer == NULL) 187554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return NULL; 188554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); 189554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (ret != 0) { 190554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka fprintf(stderr, "Couldn't get tiling of buffer %d (%s): %s\n", 191554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka handle, name, strerror(-ret)); 192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka drm_intel_bo_unreference(buffer); 193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return NULL; 194554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 195554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 196554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region = intel_region_alloc_internal(screen, cpp, 197554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka width, height, pitch, tiling, buffer); 198554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (region == NULL) { 199554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka drm_intel_bo_unreference(buffer); 200554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return NULL; 201554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 202554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 203554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->name = handle; 204554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 205554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return region; 206554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 207554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 208554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakastruct intel_region * 209554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_alloc_for_fd(struct intel_screen *screen, 210554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint cpp, 211554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka GLuint width, GLuint height, GLuint pitch, 212554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka int fd, const char *name) 213554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 214f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka struct intel_region *region; 215f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka drm_intel_bo *buffer; 216554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka int ret; 217554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka uint32_t bit_6_swizzle, tiling; 218554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 219554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, 220554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka fd, height * pitch); 221a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka if (buffer == NULL) 222a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka return NULL; 223a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); 224a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka if (ret != 0) { 225a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka fprintf(stderr, "Couldn't get tiling of buffer (%s): %s\n", 226a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka name, strerror(-ret)); 227a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka drm_intel_bo_unreference(buffer); 228a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka return NULL; 229554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 230554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 231275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka region = intel_region_alloc_internal(screen, cpp, 232ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick width, height, pitch, tiling, buffer); 233275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka if (region == NULL) { 234275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka drm_intel_bo_unreference(buffer); 235275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka return NULL; 236275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka } 237275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 238275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka return region; 239275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka} 240275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 241275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanakavoid 242275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanakaintel_region_reference(struct intel_region **dst, struct intel_region *src) 243275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka{ 2442a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao _DBG("%s: %p(%d) -> %p(%d)\n", __FUNCTION__, 245275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka *dst, *dst ? (*dst)->refcount : 0, src, src ? src->refcount : 0); 246275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 247275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka if (src != *dst) { 248275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka if (*dst) 249275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka intel_region_release(dst); 250275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 251554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (src) 252554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka src->refcount++; 253554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *dst = src; 254554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 255554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 256554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 257554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakavoid 258554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_release(struct intel_region **region_handle) 259554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 260554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka struct intel_region *region = *region_handle; 261554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 262554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (region == NULL) { 263554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka _DBG("%s NULL\n", __FUNCTION__); 264554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 265554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 266554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 267554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka _DBG("%s %p %d\n", __FUNCTION__, region, region->refcount - 1); 268554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 269554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ASSERT(region->refcount > 0); 270554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka region->refcount--; 271554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 272554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (region->refcount == 0) { 273554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka drm_intel_bo_unreference(region->bo); 274554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 275554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka free(region); 276554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 277554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *region_handle = NULL; 278554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 279554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 280554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/** 281554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * This function computes masks that may be used to select the bits of the X 282554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * and Y coordinates that indicate the offset within a tile. If the region is 283554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * untiled, the masks are set to 0. 284554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka */ 285554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakavoid 286554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakaintel_region_get_tile_masks(struct intel_region *region, 287554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka uint32_t *mask_x, uint32_t *mask_y, 288554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka bool map_stencil_as_y_tiled) 289554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka{ 290554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka int cpp = region->cpp; 291554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka uint32_t tiling = region->tiling; 292554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 293554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (map_stencil_as_y_tiled) 294554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka tiling = I915_TILING_Y; 295554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 296554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka switch (tiling) { 297554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka default: 298554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka assert(false); 299554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case I915_TILING_NONE: 300554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *mask_x = *mask_y = 0; 301554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 302554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case I915_TILING_X: 303554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *mask_x = 512 / cpp - 1; 304554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *mask_y = 7; 305554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 306554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case I915_TILING_Y: 307554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *mask_x = 128 / cpp - 1; 308554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka *mask_y = 31; 309554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 310554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 311554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 312554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 313554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/** 314554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * Compute the offset (in bytes) from the start of the region to the given x 315554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * and y coordinate. For tiled regions, caller must ensure that x and y are 316554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * multiples of the tile size. 317554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka */ 318554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakauint32_t 3192fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sandersintel_region_get_aligned_offset(struct intel_region *region, uint32_t x, 3202fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders uint32_t y, bool map_stencil_as_y_tiled) 3212fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders{ 3222fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders int cpp = region->cpp; 3232fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders uint32_t pitch = region->pitch; 3242fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders uint32_t tiling = region->tiling; 3252fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders 3262fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders if (map_stencil_as_y_tiled) { 3272fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders tiling = I915_TILING_Y; 3282fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders 3292fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders /* When mapping a W-tiled stencil buffer as Y-tiled, each 64-high W-tile 3302fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders * gets transformed into a 32-high Y-tile. Accordingly, the pitch of 3312fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders * the resulting region is twice the pitch of the original region, since 3322fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders * each row in the Y-tiled view corresponds to two rows in the actual 333554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * W-tiled surface. So we need to correct the pitch before computing 334554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka * the offsets. 335554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka */ 336554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka pitch *= 2; 337554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 338554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 339554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka switch (tiling) { 340554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka default: 341554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka assert(false); 342554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case I915_TILING_NONE: 343554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return y * pitch + x * cpp; 344554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case I915_TILING_X: 345554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka assert((x % (512 / cpp)) == 0); 346da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter assert((y % 8) == 0); 347da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter return y * pitch + x / (512 / cpp) * 4096; 348da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter case I915_TILING_Y: 349da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter assert((x % (128 / cpp)) == 0); 350da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter assert((y % 32) == 0); 351da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter return y * pitch + x / (128 / cpp) * 4096; 352da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter } 353da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter} 354da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter