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, &region->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