+++ /dev/null
-/**************************************************************************
- *
- * Copyright 2006 VMware, Inc.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-/* Provide additional functionality on top of bufmgr buffers:
- * - 2d semantics and blit operations
- * - refcounting of buffers for multiple images in a buffer.
- * - refcounting of buffer mappings.
- * - some logic for moving the buffers to the best memory pools for
- * given operations.
- *
- * Most of this is to make it easier to implement the fixed-layout
- * mipmap tree required by intel hardware in the face of GL's
- * programming interface where each image can be specifed in random
- * order and it isn't clear what layout the tree should have until the
- * last moment.
- */
-
-#include <sys/ioctl.h>
-#include <errno.h>
-
-#include "main/hash.h"
-#include "brw_context.h"
-#include "intel_regions.h"
-#include "intel_blit.h"
-#include "intel_buffer_objects.h"
-#include "intel_bufmgr.h"
-#include "intel_batchbuffer.h"
-
-#define FILE_DEBUG_FLAG DEBUG_REGION
-
-/* This should be set to the maximum backtrace size desired.
- * Set it to 0 to disable backtrace debugging.
- */
-#define DEBUG_BACKTRACE_SIZE 0
-
-#if DEBUG_BACKTRACE_SIZE == 0
-/* Use the standard debug output */
-#define _DBG(...) DBG(__VA_ARGS__)
-#else
-/* Use backtracing debug output */
-#define _DBG(...) {debug_backtrace(); DBG(__VA_ARGS__);}
-
-/* Backtracing debug support */
-#include <execinfo.h>
-
-static void
-debug_backtrace(void)
-{
- void *trace[DEBUG_BACKTRACE_SIZE];
- char **strings = NULL;
- int traceSize;
- register int i;
-
- traceSize = backtrace(trace, DEBUG_BACKTRACE_SIZE);
- strings = backtrace_symbols(trace, traceSize);
- if (strings == NULL) {
- DBG("no backtrace:");
- return;
- }
-
- /* Spit out all the strings with a colon separator. Ignore
- * the first, since we don't really care about the call
- * to debug_backtrace() itself. Skip until the final "/" in
- * the trace to avoid really long lines.
- */
- for (i = 1; i < traceSize; i++) {
- char *p = strings[i], *slash = strings[i];
- while (*p) {
- if (*p++ == '/') {
- slash = p;
- }
- }
-
- DBG("%s:", slash);
- }
-
- /* Free up the memory, and we're done */
- free(strings);
-}
-
-#endif
-
-static struct intel_region *
-intel_region_alloc_internal(struct intel_screen *screen,
- GLuint cpp,
- GLuint width, GLuint height, GLuint pitch,
- uint32_t tiling, drm_intel_bo *buffer)
-{
- struct intel_region *region;
-
- region = calloc(sizeof(*region), 1);
- if (region == NULL)
- return region;
-
- region->cpp = cpp;
- region->width = width;
- region->height = height;
- region->pitch = pitch;
- region->refcount = 1;
- region->bo = buffer;
- region->tiling = tiling;
-
- _DBG("%s <-- %p\n", __FUNCTION__, region);
- return region;
-}
-
-struct intel_region *
-intel_region_alloc(struct intel_screen *screen,
- uint32_t tiling,
- GLuint cpp, GLuint width, GLuint height,
- bool expect_accelerated_upload)
-{
- drm_intel_bo *buffer;
- unsigned long flags = 0;
- unsigned long aligned_pitch;
- struct intel_region *region;
-
- if (expect_accelerated_upload)
- flags |= BO_ALLOC_FOR_RENDER;
-
- buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "region",
- width, height, cpp,
- &tiling, &aligned_pitch, flags);
- if (buffer == NULL)
- return NULL;
-
- region = intel_region_alloc_internal(screen, cpp, width, height,
- aligned_pitch, tiling, buffer);
- if (region == NULL) {
- drm_intel_bo_unreference(buffer);
- return NULL;
- }
-
- return region;
-}
-
-void
-intel_region_reference(struct intel_region **dst, struct intel_region *src)
-{
- _DBG("%s: %p(%d) -> %p(%d)\n", __FUNCTION__,
- *dst, *dst ? (*dst)->refcount : 0, src, src ? src->refcount : 0);
-
- if (src != *dst) {
- if (*dst)
- intel_region_release(dst);
-
- if (src)
- src->refcount++;
- *dst = src;
- }
-}
-
-void
-intel_region_release(struct intel_region **region_handle)
-{
- struct intel_region *region = *region_handle;
-
- if (region == NULL) {
- _DBG("%s NULL\n", __FUNCTION__);
- return;
- }
-
- _DBG("%s %p %d\n", __FUNCTION__, region, region->refcount - 1);
-
- ASSERT(region->refcount > 0);
- region->refcount--;
-
- if (region->refcount == 0) {
- drm_intel_bo_unreference(region->bo);
-
- free(region);
- }
- *region_handle = NULL;
-}
extern "C" {
#endif
-struct brw_context;
-struct intel_screen;
-struct intel_buffer_object;
-
-/**
- * A layer on top of the bufmgr buffers that adds a few useful things:
- *
- * - Refcounting for local buffer references.
- * - Refcounting for buffer maps
- * - Buffer dimensions - pitch and height.
- * - Blitter commands for copying 2D regions between buffers. (really???)
- */
-struct intel_region
-{
- drm_intel_bo *bo; /**< buffer manager's buffer */
- GLuint refcount; /**< Reference count for region */
- GLuint cpp; /**< bytes per pixel */
- GLuint width; /**< in pixels */
- GLuint height; /**< in pixels */
- GLuint pitch; /**< in bytes */
-
- uint32_t tiling; /**< Which tiling mode the region is in */
-};
-
-
-/* Allocate a refcounted region. Pointers to regions should only be
- * copied by calling intel_reference_region().
- */
-struct intel_region *intel_region_alloc(struct intel_screen *screen,
- uint32_t tiling,
- GLuint cpp, GLuint width,
- GLuint height,
- bool expect_accelerated_upload);
-
-void intel_region_reference(struct intel_region **dst,
- struct intel_region *src);
-
-void intel_region_release(struct intel_region **ib);
-
/**
* Used with images created with image_from_names
* to help support planar images.