Commit 9087ba12 authored by Kristian Høgsberg's avatar Kristian Høgsberg
Browse files

intel: Take an intel_screen pointer in intel_alloc_region_* functions

parent 5aaa53e6
...@@ -377,7 +377,8 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) ...@@ -377,7 +377,8 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
intel_region_reference(&region, depth_region); intel_region_reference(&region, depth_region);
} }
else else
region = intel_region_alloc_for_handle(intel, buffers[i].cpp, region = intel_region_alloc_for_handle(intel->intelScreen,
buffers[i].cpp,
drawable->w, drawable->w,
drawable->h, drawable->h,
buffers[i].pitch / buffers[i].cpp, buffers[i].pitch / buffers[i].cpp,
......
...@@ -182,7 +182,7 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb, ...@@ -182,7 +182,7 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
/* alloc hardware renderbuffer */ /* alloc hardware renderbuffer */
DBG("Allocating %d x %d Intel RBO\n", width, height); DBG("Allocating %d x %d Intel RBO\n", width, height);
irb->region = intel_region_alloc(intel, I915_TILING_NONE, cpp, irb->region = intel_region_alloc(intel->intelScreen, I915_TILING_NONE, cpp,
width, height, GL_TRUE); width, height, GL_TRUE);
if (!irb->region) if (!irb->region)
return GL_FALSE; /* out of memory? */ return GL_FALSE; /* out of memory? */
......
...@@ -137,7 +137,7 @@ intel_miptree_create(struct intel_context *intel, ...@@ -137,7 +137,7 @@ intel_miptree_create(struct intel_context *intel,
return NULL; return NULL;
} }
mt->region = intel_region_alloc(intel, mt->region = intel_region_alloc(intel->intelScreen,
tiling, tiling,
mt->cpp, mt->cpp,
mt->total_width, mt->total_width,
......
...@@ -142,10 +142,10 @@ intel_region_unmap(struct intel_context *intel, struct intel_region *region) ...@@ -142,10 +142,10 @@ intel_region_unmap(struct intel_context *intel, struct intel_region *region)
} }
static struct intel_region * static struct intel_region *
intel_region_alloc_internal(struct intel_context *intel, intel_region_alloc_internal(struct intel_screen *screen,
GLuint cpp, GLuint cpp,
GLuint width, GLuint height, GLuint pitch, GLuint width, GLuint height, GLuint pitch,
drm_intel_bo *buffer) uint32_t tiling, drm_intel_bo *buffer)
{ {
struct intel_region *region; struct intel_region *region;
...@@ -164,44 +164,36 @@ intel_region_alloc_internal(struct intel_context *intel, ...@@ -164,44 +164,36 @@ intel_region_alloc_internal(struct intel_context *intel,
region->pitch = pitch; region->pitch = pitch;
region->refcount = 1; region->refcount = 1;
region->buffer = buffer; region->buffer = buffer;
region->tiling = tiling;
/* Default to no tiling */ region->screen = screen;
region->tiling = I915_TILING_NONE;
_DBG("%s <-- %p\n", __FUNCTION__, region); _DBG("%s <-- %p\n", __FUNCTION__, region);
return region; return region;
} }
struct intel_region * struct intel_region *
intel_region_alloc(struct intel_context *intel, intel_region_alloc(struct intel_screen *screen,
uint32_t tiling, uint32_t tiling,
GLuint cpp, GLuint width, GLuint height, GLuint cpp, GLuint width, GLuint height,
GLboolean expect_accelerated_upload) GLboolean expect_accelerated_upload)
{ {
drm_intel_bo *buffer; drm_intel_bo *buffer;
struct intel_region *region;
unsigned long flags = 0; unsigned long flags = 0;
unsigned long aligned_pitch; unsigned long aligned_pitch;
if (expect_accelerated_upload) if (expect_accelerated_upload)
flags |= BO_ALLOC_FOR_RENDER; flags |= BO_ALLOC_FOR_RENDER;
buffer = drm_intel_bo_alloc_tiled(intel->bufmgr, "region", buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "region",
width, height, cpp, width, height, cpp,
&tiling, &aligned_pitch, flags); &tiling, &aligned_pitch, flags);
region = intel_region_alloc_internal(intel, cpp, width, height, return intel_region_alloc_internal(screen, cpp, width, height,
aligned_pitch / cpp, buffer); aligned_pitch / cpp, tiling, buffer);
if (region == NULL)
return region;
region->tiling = tiling;
return region;
} }
struct intel_region * struct intel_region *
intel_region_alloc_for_handle(struct intel_context *intel, intel_region_alloc_for_handle(struct intel_screen *screen,
GLuint cpp, GLuint cpp,
GLuint width, GLuint height, GLuint pitch, GLuint width, GLuint height, GLuint pitch,
GLuint handle, const char *name) GLuint handle, const char *name)
...@@ -209,9 +201,9 @@ intel_region_alloc_for_handle(struct intel_context *intel, ...@@ -209,9 +201,9 @@ intel_region_alloc_for_handle(struct intel_context *intel,
struct intel_region *region, *dummy; struct intel_region *region, *dummy;
drm_intel_bo *buffer; drm_intel_bo *buffer;
int ret; int ret;
uint32_t bit_6_swizzle; uint32_t bit_6_swizzle, tiling;
region = _mesa_HashLookup(intel->intelScreen->named_regions, handle); region = _mesa_HashLookup(screen->named_regions, handle);
if (region != NULL) { if (region != NULL) {
dummy = NULL; dummy = NULL;
if (region->width != width || region->height != height || if (region->width != width || region->height != height ||
...@@ -225,25 +217,26 @@ intel_region_alloc_for_handle(struct intel_context *intel, ...@@ -225,25 +217,26 @@ intel_region_alloc_for_handle(struct intel_context *intel,
return dummy; return dummy;
} }
buffer = intel_bo_gem_create_from_name(intel->bufmgr, name, handle); buffer = intel_bo_gem_create_from_name(screen->bufmgr, name, handle);
if (buffer == NULL)
region = intel_region_alloc_internal(intel, cpp, return NULL;
width, height, pitch, buffer); ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle);
if (region == NULL)
return region;
ret = drm_intel_bo_get_tiling(region->buffer, &region->tiling,
&bit_6_swizzle);
if (ret != 0) { if (ret != 0) {
fprintf(stderr, "Couldn't get tiling of buffer %d (%s): %s\n", fprintf(stderr, "Couldn't get tiling of buffer %d (%s): %s\n",
handle, name, strerror(-ret)); handle, name, strerror(-ret));
intel_region_release(&region); drm_intel_bo_unreference(buffer);
return NULL;
}
region = intel_region_alloc_internal(screen, cpp,
width, height, pitch, tiling, buffer);
if (region == NULL) {
drm_intel_bo_unreference(buffer);
return NULL; return NULL;
} }
region->name = handle; region->name = handle;
region->screen = intel->intelScreen; _mesa_HashInsert(screen->named_regions, handle, region);
_mesa_HashInsert(intel->intelScreen->named_regions, handle, region);
return region; return region;
} }
......
...@@ -76,14 +76,14 @@ struct intel_region ...@@ -76,14 +76,14 @@ struct intel_region
/* Allocate a refcounted region. Pointers to regions should only be /* Allocate a refcounted region. Pointers to regions should only be
* copied by calling intel_reference_region(). * copied by calling intel_reference_region().
*/ */
struct intel_region *intel_region_alloc(struct intel_context *intel, struct intel_region *intel_region_alloc(struct intel_screen *screen,
uint32_t tiling, uint32_t tiling,
GLuint cpp, GLuint width, GLuint cpp, GLuint width,
GLuint height, GLuint height,
GLboolean expect_accelerated_upload); GLboolean expect_accelerated_upload);
struct intel_region * struct intel_region *
intel_region_alloc_for_handle(struct intel_context *intel, intel_region_alloc_for_handle(struct intel_screen *screen,
GLuint cpp, GLuint cpp,
GLuint width, GLuint height, GLuint pitch, GLuint width, GLuint height, GLuint pitch,
unsigned int handle, const char *name); unsigned int handle, const char *name);
......
...@@ -159,7 +159,8 @@ intel_create_image_from_name(__DRIcontext *context, ...@@ -159,7 +159,8 @@ intel_create_image_from_name(__DRIcontext *context,
image->data = loaderPrivate; image->data = loaderPrivate;
cpp = _mesa_get_format_bytes(image->format); cpp = _mesa_get_format_bytes(image->format);
image->region = intel_region_alloc_for_handle(intel, cpp, width, height, image->region = intel_region_alloc_for_handle(intel->intelScreen,
cpp, width, height,
pitch, name, "image"); pitch, name, "image");
if (image->region == NULL) { if (image->region == NULL) {
FREE(image); FREE(image);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment