Lift region-related functions up to the pipe interface.
Some of these functions probably should be driver-private. Note: intel_buffer_object is in p_state.h and should be fixed/removed. There are just a few i915 dependencies in intel_region.c
This commit is contained in:
@@ -26,9 +26,6 @@
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "context.h"
|
||||
#include "enums.h"
|
||||
@@ -39,9 +36,11 @@
|
||||
#include "intel_context.h"
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_reg.h"
|
||||
#include "intel_regions.h"
|
||||
#include "vblank.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_BLIT
|
||||
|
||||
/**
|
||||
@@ -87,9 +86,9 @@ intelCopyBuffer(__DRIdrawablePrivate * dPriv,
|
||||
|
||||
if (dPriv && dPriv->numClipRects) {
|
||||
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
|
||||
const struct intel_region *frontRegion
|
||||
const struct pipe_region *frontRegion
|
||||
= intelScreen->front_region;
|
||||
const struct intel_region *backRegion
|
||||
const struct pipe_region *backRegion
|
||||
= intel_fb->Base._ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT ?
|
||||
intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT) :
|
||||
intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
@@ -447,10 +446,10 @@ intelClearWithBlit(GLcontext * ctx, GLbitfield mask)
|
||||
const GLbitfield bufBit = 1 << buf;
|
||||
if ((clearMask & bufBit) && !(bufBit & skipBuffers)) {
|
||||
/* OK, clear this renderbuffer */
|
||||
struct intel_region *irb_region =
|
||||
struct pipe_region *irb_region =
|
||||
intel_get_rb_region(fb, buf);
|
||||
struct _DriBufferObject *write_buffer =
|
||||
intel_region_buffer(intel->intelScreen, irb_region,
|
||||
intel->pipe->region_buffer(intel->pipe, irb_region,
|
||||
all ? INTEL_WRITE_FULL :
|
||||
INTEL_WRITE_PART);
|
||||
|
||||
|
@@ -32,9 +32,12 @@
|
||||
|
||||
#include "intel_context.h"
|
||||
#include "intel_buffer_objects.h"
|
||||
#include "intel_regions.h"
|
||||
#include "dri_bufmgr.h"
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
|
||||
/**
|
||||
* There is some duplication between mesa's bufferobjects and our
|
||||
* bufmgr buffers. Both have an integer handle and a hashtable to
|
||||
@@ -89,7 +92,7 @@ intel_bufferobj_cow(struct intel_context *intel,
|
||||
struct intel_buffer_object *intel_obj)
|
||||
{
|
||||
assert(intel_obj->region);
|
||||
intel_region_cow(intel->intelScreen, intel_obj->region);
|
||||
intel->pipe->region_cow(intel->pipe, intel_obj->region);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#include "mtypes.h"
|
||||
|
||||
struct intel_context;
|
||||
struct intel_region;
|
||||
struct pipe_region;
|
||||
struct gl_buffer_object;
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ struct intel_buffer_object
|
||||
struct gl_buffer_object Base;
|
||||
struct _DriBufferObject *buffer; /* the low-level buffer manager's buffer handle */
|
||||
|
||||
struct intel_region *region; /* Is there a zero-copy texture
|
||||
struct pipe_region *region; /* Is there a zero-copy texture
|
||||
associated with this (pixel)
|
||||
buffer object? */
|
||||
};
|
||||
@@ -75,7 +75,7 @@ intel_buffer_object(struct gl_buffer_object *obj)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Helpers for zerocopy image uploads. See also intel_regions.h:
|
||||
/* Helpers for zerocopy image uploads. See also pipe_regions.h:
|
||||
*/
|
||||
void intel_bufferobj_cow(struct intel_context *intel,
|
||||
struct intel_buffer_object *intel_obj);
|
||||
|
@@ -31,7 +31,6 @@
|
||||
#include "intel_buffers.h"
|
||||
#include "intel_depthstencil.h"
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_batchbuffer.h"
|
||||
#include "intel_reg.h"
|
||||
#include "context.h"
|
||||
@@ -96,7 +95,7 @@ intel_intersect_cliprects(drm_clip_rect_t * dst,
|
||||
/**
|
||||
* Return pointer to current color drawing region, or NULL.
|
||||
*/
|
||||
struct intel_region *
|
||||
struct pipe_region *
|
||||
intel_drawbuf_region(struct intel_context *intel)
|
||||
{
|
||||
struct intel_renderbuffer *irbColor =
|
||||
@@ -110,7 +109,7 @@ intel_drawbuf_region(struct intel_context *intel)
|
||||
/**
|
||||
* Return pointer to current color reading region, or NULL.
|
||||
*/
|
||||
struct intel_region *
|
||||
struct pipe_region *
|
||||
intel_readbuf_region(struct intel_context *intel)
|
||||
{
|
||||
struct intel_renderbuffer *irb
|
||||
@@ -325,7 +324,7 @@ intelClear(GLcontext *ctx, GLbitfield mask)
|
||||
|
||||
/* HW stencil */
|
||||
if (mask & BUFFER_BIT_STENCIL) {
|
||||
const struct intel_region *stencilRegion
|
||||
const struct pipe_region *stencilRegion
|
||||
= intel_get_rb_region(fb, BUFFER_STENCIL);
|
||||
if (stencilRegion) {
|
||||
/* have hw stencil */
|
||||
@@ -369,8 +368,10 @@ intelClear(GLcontext *ctx, GLbitfield mask)
|
||||
if (blit_mask)
|
||||
intelClearWithBlit(ctx, blit_mask);
|
||||
|
||||
#if 1
|
||||
if (swrast_mask | tri_mask)
|
||||
_swrast_Clear(ctx, swrast_mask | tri_mask);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -625,7 +626,7 @@ void
|
||||
intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct intel_region *colorRegion, *depthRegion = NULL;
|
||||
struct pipe_region *colorRegion, *depthRegion = NULL;
|
||||
struct intel_renderbuffer *irbDepth = NULL, *irbStencil = NULL;
|
||||
|
||||
if (!fb) {
|
||||
|
@@ -38,9 +38,9 @@ intel_intersect_cliprects(drm_clip_rect_t * dest,
|
||||
const drm_clip_rect_t * a,
|
||||
const drm_clip_rect_t * b);
|
||||
|
||||
extern struct intel_region *intel_readbuf_region(struct intel_context *intel);
|
||||
extern struct pipe_region *intel_readbuf_region(struct intel_context *intel);
|
||||
|
||||
extern struct intel_region *intel_drawbuf_region(struct intel_context *intel);
|
||||
extern struct pipe_region *intel_drawbuf_region(struct intel_context *intel);
|
||||
|
||||
extern void intel_wait_flips(struct intel_context *intel, GLuint batch_flags);
|
||||
|
||||
|
@@ -55,12 +55,12 @@
|
||||
#include "intel_batchbuffer.h"
|
||||
#include "intel_blit.h"
|
||||
#include "intel_pixel.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_buffer_objects.h"
|
||||
#include "intel_fbo.h"
|
||||
|
||||
#include "pipe/softpipe/sp_context.h"
|
||||
#include "state_tracker/st_public.h"
|
||||
#include "state_tracker/st_context.h"
|
||||
|
||||
|
||||
#include "drirenderbuffer.h"
|
||||
@@ -90,7 +90,7 @@ int INTEL_DEBUG = (0);
|
||||
#include "extension_helper.h"
|
||||
|
||||
|
||||
#define DRIVER_DATE "20061102"
|
||||
#define DRIVER_DATE "20070731"
|
||||
|
||||
_glthread_Mutex lockMutex;
|
||||
static GLboolean lockMutexInit = GL_FALSE;
|
||||
@@ -355,13 +355,6 @@ intelCreateContext(const __GLcontextModes * mesaVis,
|
||||
int fthrottle_mode;
|
||||
GLboolean havePools;
|
||||
|
||||
DRM_LIGHT_LOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
|
||||
havePools = intelCreatePools(intelScreen);
|
||||
DRM_UNLOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
|
||||
|
||||
if (!havePools)
|
||||
return GL_FALSE;
|
||||
|
||||
intelInitDriverFunctions(&functions);
|
||||
|
||||
if (!_mesa_initialize_context(&intel->ctx,
|
||||
@@ -416,11 +409,31 @@ intelCreateContext(const __GLcontextModes * mesaVis,
|
||||
_tnl_CreateContext(ctx);
|
||||
_swsetup_CreateContext(ctx);
|
||||
|
||||
|
||||
/* Configure swrast to match hardware characteristics: */
|
||||
_swrast_allow_pixel_fog(ctx, GL_FALSE);
|
||||
_swrast_allow_vertex_fog(ctx, GL_TRUE);
|
||||
|
||||
/*
|
||||
* Pipe-related setup
|
||||
*/
|
||||
st_create_context( &intel->ctx,
|
||||
softpipe_create() );
|
||||
|
||||
intel->pipe = intel->ctx.st->pipe;
|
||||
intel->pipe->screen = intelScreen;
|
||||
intelScreen->pipe = intel->pipe;
|
||||
intel_init_region_functions(intel->pipe);
|
||||
|
||||
/*
|
||||
* memory pools
|
||||
*/
|
||||
DRM_LIGHT_LOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
|
||||
havePools = intelCreatePools(intelScreen);
|
||||
DRM_UNLOCK(sPriv->fd, &sPriv->pSAREA->lock, driContextPriv->hHWContext);
|
||||
if (!havePools)
|
||||
return GL_FALSE;
|
||||
|
||||
|
||||
/* Dri stuff */
|
||||
intel->hHWContext = driContextPriv->hHWContext;
|
||||
intel->driFd = sPriv->fd;
|
||||
@@ -497,10 +510,6 @@ intelCreateContext(const __GLcontextModes * mesaVis,
|
||||
}
|
||||
|
||||
|
||||
st_create_context( &intel->ctx,
|
||||
softpipe_create() );
|
||||
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
@@ -48,7 +48,8 @@
|
||||
#define DV_PF_565 (2<<8)
|
||||
#define DV_PF_8888 (3<<8)
|
||||
|
||||
struct intel_region;
|
||||
struct pipe_context;
|
||||
struct pipe_region;
|
||||
struct intel_context;
|
||||
struct _DriBufferObject;
|
||||
|
||||
@@ -121,6 +122,8 @@ struct intel_context
|
||||
{
|
||||
GLcontext ctx; /* the parent class */
|
||||
|
||||
struct pipe_context *pipe;
|
||||
|
||||
GLint refcount;
|
||||
GLuint Fallback;
|
||||
GLuint NewGLState;
|
||||
@@ -422,5 +425,7 @@ intel_texture_image(struct gl_texture_image *img)
|
||||
extern struct intel_renderbuffer *intel_renderbuffer(struct gl_renderbuffer
|
||||
*rb);
|
||||
|
||||
extern void intel_init_region_functions(struct pipe_context *pipe);
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -38,8 +38,8 @@
|
||||
#include "intel_context.h"
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_depthstencil.h"
|
||||
#include "intel_regions.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
/**
|
||||
* The GL_EXT_framebuffer_object allows the user to create their own
|
||||
@@ -95,12 +95,12 @@ map_regions(GLcontext * ctx,
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
if (depthRb && depthRb->region) {
|
||||
intel_region_map(intel->intelScreen, depthRb->region);
|
||||
intel->pipe->region_map(intel->pipe, depthRb->region);
|
||||
depthRb->pfMap = depthRb->region->map;
|
||||
depthRb->pfPitch = depthRb->region->pitch;
|
||||
}
|
||||
if (stencilRb && stencilRb->region) {
|
||||
intel_region_map(intel->intelScreen, stencilRb->region);
|
||||
intel->pipe->region_map(intel->pipe, stencilRb->region);
|
||||
stencilRb->pfMap = stencilRb->region->map;
|
||||
stencilRb->pfPitch = stencilRb->region->pitch;
|
||||
}
|
||||
@@ -113,12 +113,12 @@ unmap_regions(GLcontext * ctx,
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
if (depthRb && depthRb->region) {
|
||||
intel_region_unmap(intel->intelScreen, depthRb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, depthRb->region);
|
||||
depthRb->pfMap = NULL;
|
||||
depthRb->pfPitch = 0;
|
||||
}
|
||||
if (stencilRb && stencilRb->region) {
|
||||
intel_region_unmap(intel->intelScreen, stencilRb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, stencilRb->region);
|
||||
stencilRb->pfMap = NULL;
|
||||
stencilRb->pfPitch = 0;
|
||||
}
|
||||
|
@@ -40,9 +40,9 @@
|
||||
#include "intel_depthstencil.h"
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_mipmap_tree.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_span.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_FBO
|
||||
|
||||
@@ -111,7 +111,7 @@ intel_flip_renderbuffers(struct intel_framebuffer *intel_fb)
|
||||
}
|
||||
|
||||
|
||||
struct intel_region *
|
||||
struct pipe_region *
|
||||
intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex)
|
||||
{
|
||||
struct intel_renderbuffer *irb = intel_get_renderbuffer(fb, attIndex);
|
||||
@@ -153,7 +153,7 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb)
|
||||
}
|
||||
|
||||
if (intel && irb->region) {
|
||||
intel_region_release(&irb->region);
|
||||
intel->pipe->region_release(intel->pipe, &irb->region);
|
||||
}
|
||||
|
||||
_mesa_free(irb);
|
||||
@@ -265,7 +265,7 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
|
||||
|
||||
/* free old region */
|
||||
if (irb->region) {
|
||||
intel_region_release(&irb->region);
|
||||
intel->pipe->region_release(intel->pipe, &irb->region);
|
||||
}
|
||||
|
||||
/* allocate new memory region/renderbuffer */
|
||||
@@ -282,7 +282,7 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
|
||||
DBG("Allocating %d x %d Intel RBO (pitch %d)\n", width,
|
||||
height, pitch);
|
||||
|
||||
irb->region = intel_region_alloc(intel->intelScreen, cpp, pitch, height);
|
||||
irb->region = intel->pipe->region_alloc(intel->pipe, cpp, pitch, height);
|
||||
if (!irb->region)
|
||||
return GL_FALSE; /* out of memory? */
|
||||
|
||||
@@ -382,7 +382,7 @@ intel_new_renderbuffer_fb(GLuint intFormat)
|
||||
irb->Base.surface = intel_new_surface(intFormat);
|
||||
irb->Base.surface->rb = irb;
|
||||
|
||||
return &irb->Base;
|
||||
return irb;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -509,6 +509,7 @@ intel_wrap_texture(GLcontext * ctx, struct gl_texture_image *texImage)
|
||||
|
||||
irb->Base.Delete = intel_delete_renderbuffer;
|
||||
irb->Base.AllocStorage = intel_nop_alloc_storage;
|
||||
|
||||
intel_set_span_functions(&irb->Base);
|
||||
|
||||
irb->RenderToTexture = GL_TRUE;
|
||||
@@ -528,6 +529,7 @@ intel_render_texture(GLcontext * ctx,
|
||||
struct gl_framebuffer *fb,
|
||||
struct gl_renderbuffer_attachment *att)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct gl_texture_image *newImage
|
||||
= att->Texture->Image[att->CubeMapFace][att->TextureLevel];
|
||||
struct intel_renderbuffer *irb = intel_renderbuffer(att->Renderbuffer);
|
||||
@@ -560,8 +562,8 @@ intel_render_texture(GLcontext * ctx,
|
||||
intel_image = intel_texture_image(newImage);
|
||||
if (irb->region != intel_image->mt->region) {
|
||||
if (irb->region)
|
||||
intel_region_release(&irb->region);
|
||||
intel_region_reference(&irb->region, intel_image->mt->region);
|
||||
intel->pipe->region_release(intel->pipe, &irb->region);
|
||||
pipe_region_reference(&irb->region, intel_image->mt->region);
|
||||
}
|
||||
|
||||
/* compute offset of the particular 2D image within the texture region */
|
||||
@@ -590,13 +592,14 @@ static void
|
||||
intel_finish_render_texture(GLcontext * ctx,
|
||||
struct gl_renderbuffer_attachment *att)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct intel_renderbuffer *irb = intel_renderbuffer(att->Renderbuffer);
|
||||
|
||||
DBG("End render texture (tid %x) tex %u\n", _glthread_GetID(), att->Texture->Name);
|
||||
|
||||
if (irb) {
|
||||
/* just release the region */
|
||||
intel_region_release(&irb->region);
|
||||
intel->pipe->region_release(intel->pipe, &irb->region);
|
||||
}
|
||||
else if (att->Renderbuffer) {
|
||||
/* software fallback */
|
||||
|
@@ -34,7 +34,7 @@
|
||||
|
||||
|
||||
struct intel_context;
|
||||
struct intel_region;
|
||||
struct pipe_region;
|
||||
|
||||
|
||||
/**
|
||||
@@ -76,7 +76,7 @@ struct intel_framebuffer
|
||||
struct intel_renderbuffer
|
||||
{
|
||||
struct gl_renderbuffer Base;
|
||||
struct intel_region *region;
|
||||
struct pipe_region *region;
|
||||
void *pfMap; /* possibly paged flipped map pointer */
|
||||
GLuint pfPitch; /* possibly paged flipped pitch */
|
||||
GLboolean RenderToTexture; /* RTT? */
|
||||
@@ -115,7 +115,7 @@ extern void intel_flip_renderbuffers(struct intel_framebuffer *intel_fb);
|
||||
|
||||
|
||||
/* XXX make inline or macro */
|
||||
extern struct intel_region *intel_get_rb_region(struct gl_framebuffer *fb,
|
||||
extern struct pipe_region *intel_get_rb_region(struct gl_framebuffer *fb,
|
||||
GLuint attIndex);
|
||||
|
||||
|
||||
|
@@ -39,7 +39,6 @@
|
||||
#include "intel_ioctl.h"
|
||||
#include "intel_batchbuffer.h"
|
||||
#include "intel_blit.h"
|
||||
#include "intel_regions.h"
|
||||
#include "drm.h"
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_IOCTL
|
||||
|
@@ -27,9 +27,12 @@
|
||||
|
||||
#include "intel_context.h"
|
||||
#include "intel_mipmap_tree.h"
|
||||
#include "intel_regions.h"
|
||||
#include "enums.h"
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_MIPTREE
|
||||
|
||||
static GLenum
|
||||
@@ -100,7 +103,7 @@ intel_miptree_create(struct intel_context *intel,
|
||||
ok = 0; /* TODO */
|
||||
|
||||
if (ok)
|
||||
mt->region = intel_region_alloc(intel->intelScreen,
|
||||
mt->region = intel->pipe->region_alloc(intel->pipe,
|
||||
mt->cpp, mt->pitch, mt->total_height);
|
||||
|
||||
if (!mt->region) {
|
||||
@@ -134,7 +137,7 @@ intel_miptree_release(struct intel_context *intel,
|
||||
|
||||
DBG("%s deleting %p\n", __FUNCTION__, *mt);
|
||||
|
||||
intel_region_release(&((*mt)->region));
|
||||
intel->pipe->region_release(intel->pipe, &((*mt)->region));
|
||||
|
||||
for (i = 0; i < MAX_TEXTURE_LEVELS; i++)
|
||||
if ((*mt)->level[i].image_offset)
|
||||
@@ -271,6 +274,7 @@ intel_miptree_image_map(struct intel_context * intel,
|
||||
GLuint level,
|
||||
GLuint * row_stride, GLuint * image_offsets)
|
||||
{
|
||||
GLubyte *ptr;
|
||||
DBG("%s \n", __FUNCTION__);
|
||||
|
||||
if (row_stride)
|
||||
@@ -280,8 +284,9 @@ intel_miptree_image_map(struct intel_context * intel,
|
||||
memcpy(image_offsets, mt->level[level].image_offset,
|
||||
mt->level[level].depth * sizeof(GLuint));
|
||||
|
||||
return (intel_region_map(intel->intelScreen, mt->region) +
|
||||
intel_miptree_image_offset(mt, face, level));
|
||||
ptr = intel->pipe->region_map(intel->pipe, mt->region);
|
||||
|
||||
return ptr + intel_miptree_image_offset(mt, face, level);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -289,7 +294,7 @@ intel_miptree_image_unmap(struct intel_context *intel,
|
||||
struct intel_mipmap_tree *mt)
|
||||
{
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
intel_region_unmap(intel->intelScreen, mt->region);
|
||||
intel->pipe->region_unmap(intel->pipe, mt->region);
|
||||
}
|
||||
|
||||
|
||||
@@ -315,7 +320,7 @@ intel_miptree_image_data(struct intel_context *intel,
|
||||
height = dst->level[level].height;
|
||||
if(dst->compressed)
|
||||
height /= 4;
|
||||
intel_region_data(intel->intelScreen, dst->region,
|
||||
intel->pipe->region_data(intel->pipe, dst->region,
|
||||
dst_offset + dst_depth_offset[i], /* dst_offset */
|
||||
0, 0, /* dstx, dsty */
|
||||
src,
|
||||
@@ -347,7 +352,7 @@ intel_miptree_image_copy(struct intel_context *intel,
|
||||
if (dst->compressed)
|
||||
height /= 4;
|
||||
for (i = 0; i < depth; i++) {
|
||||
intel_region_copy(intel->intelScreen,
|
||||
intel->pipe->region_copy(intel->pipe,
|
||||
dst->region, dst_offset + dst_depth_offset[i],
|
||||
0,
|
||||
0,
|
||||
|
@@ -28,14 +28,18 @@
|
||||
#ifndef INTEL_MIPMAP_TREE_H
|
||||
#define INTEL_MIPMAP_TREE_H
|
||||
|
||||
#include "intel_regions.h"
|
||||
#include "intel_context.h"
|
||||
#include "main/glheader.h"
|
||||
|
||||
/* A layer on top of the intel_regions code which adds:
|
||||
struct pipe_region;
|
||||
|
||||
|
||||
/* A layer on top of the pipe_regions code which adds:
|
||||
*
|
||||
* - Code to size and layout a region to hold a set of mipmaps.
|
||||
* - Query to determine if a new image fits in an existing tree.
|
||||
* - More refcounting
|
||||
* - maybe able to remove refcounting from intel_region?
|
||||
* - maybe able to remove refcounting from pipe_region?
|
||||
* - ?
|
||||
*
|
||||
* The fixed mipmap layout of intel hardware where one offset
|
||||
@@ -45,7 +49,7 @@
|
||||
* independent offset.
|
||||
*
|
||||
* In an ideal world, each texture object would be associated with a
|
||||
* single bufmgr buffer or 2d intel_region, and all the images within
|
||||
* single bufmgr buffer or 2d pipe_region, and all the images within
|
||||
* the texture object would slot into the tree as they arrive. The
|
||||
* reality can be a little messier, as images can arrive from the user
|
||||
* with sizes that don't fit in the existing tree, or in an order
|
||||
@@ -103,7 +107,7 @@ struct intel_mipmap_tree
|
||||
|
||||
/* The data is held here:
|
||||
*/
|
||||
struct intel_region *region;
|
||||
struct pipe_region *region;
|
||||
|
||||
/* These are also refcounted:
|
||||
*/
|
||||
|
@@ -25,13 +25,11 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "enums.h"
|
||||
#include "state.h"
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
#include "intel_context.h"
|
||||
#include "intel_pixel.h"
|
||||
#include "intel_regions.h"
|
||||
|
||||
|
||||
void
|
||||
|
@@ -36,7 +36,7 @@ GLboolean intel_check_blit_fragment_ops(GLcontext * ctx);
|
||||
|
||||
GLboolean intel_check_meta_tex_fragment_ops(GLcontext * ctx);
|
||||
|
||||
GLboolean intel_check_blit_format(struct intel_region *region,
|
||||
GLboolean intel_check_blit_format(struct pipe_region *region,
|
||||
GLenum format, GLenum type);
|
||||
|
||||
|
||||
|
@@ -39,17 +39,29 @@
|
||||
* last moment.
|
||||
*/
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
#include "intel_context.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_blit.h"
|
||||
#include "intel_buffer_objects.h"
|
||||
#include "dri_bufmgr.h"
|
||||
#include "intel_batchbuffer.h"
|
||||
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_REGION
|
||||
|
||||
void
|
||||
intel_region_idle(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
|
||||
/** XXX temporary helper */
|
||||
static intelScreenPrivate *
|
||||
pipe_screen(struct pipe_context *pipe)
|
||||
{
|
||||
return (intelScreenPrivate *) pipe->screen;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
intel_region_idle(struct pipe_context *pipe, struct pipe_region *region)
|
||||
{
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
if (region && region->buffer)
|
||||
@@ -58,13 +70,14 @@ intel_region_idle(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
|
||||
/* XXX: Thread safety?
|
||||
*/
|
||||
GLubyte *
|
||||
intel_region_map(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
static GLubyte *
|
||||
intel_region_map(struct pipe_context *pipe, struct pipe_region *region)
|
||||
{
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
if (!region->map_refcount++) {
|
||||
if (region->pbo)
|
||||
intel_region_cow(intelScreen, region);
|
||||
if (region->pbo) {
|
||||
pipe->region_cow(pipe, region);
|
||||
}
|
||||
|
||||
region->map = driBOMap(region->buffer,
|
||||
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0);
|
||||
@@ -73,8 +86,8 @@ intel_region_map(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
return region->map;
|
||||
}
|
||||
|
||||
void
|
||||
intel_region_unmap(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
static void
|
||||
intel_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
|
||||
{
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
if (!--region->map_refcount) {
|
||||
@@ -85,11 +98,12 @@ intel_region_unmap(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
|
||||
#undef TEST_CACHED_TEXTURES
|
||||
|
||||
struct intel_region *
|
||||
intel_region_alloc(intelScreenPrivate *intelScreen,
|
||||
static struct pipe_region *
|
||||
intel_region_alloc(struct pipe_context *pipe,
|
||||
GLuint cpp, GLuint pitch, GLuint height)
|
||||
{
|
||||
struct intel_region *region = calloc(sizeof(*region), 1);
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct pipe_region *region = calloc(sizeof(*region), 1);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
@@ -114,18 +128,8 @@ intel_region_alloc(intelScreenPrivate *intelScreen,
|
||||
return region;
|
||||
}
|
||||
|
||||
void
|
||||
intel_region_reference(struct intel_region **dst, struct intel_region *src)
|
||||
{
|
||||
assert(*dst == NULL);
|
||||
if (src) {
|
||||
src->refcount++;
|
||||
*dst = src;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
intel_region_release(struct intel_region **region)
|
||||
static void
|
||||
intel_region_release(struct pipe_context *pipe, struct pipe_region **region)
|
||||
{
|
||||
if (!*region)
|
||||
return;
|
||||
@@ -148,14 +152,15 @@ intel_region_release(struct intel_region **region)
|
||||
}
|
||||
|
||||
|
||||
struct intel_region *
|
||||
intel_region_create_static(intelScreenPrivate *intelScreen,
|
||||
static struct pipe_region *
|
||||
intel_region_create_static(struct pipe_context *pipe,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp, GLuint pitch, GLuint height)
|
||||
{
|
||||
struct intel_region *region = calloc(sizeof(*region), 1);
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct pipe_region *region = calloc(sizeof(*region), 1);
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
|
||||
region->cpp = cpp;
|
||||
@@ -179,14 +184,16 @@ intel_region_create_static(intelScreenPrivate *intelScreen,
|
||||
|
||||
|
||||
|
||||
void
|
||||
intel_region_update_static(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region,
|
||||
static void
|
||||
intel_region_update_static(struct pipe_context *pipe,
|
||||
struct pipe_region *region,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp, GLuint pitch, GLuint height)
|
||||
{
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
|
||||
region->cpp = cpp;
|
||||
@@ -252,14 +259,15 @@ _mesa_copy_rect(GLubyte * dst,
|
||||
*
|
||||
* Currently always memcpy.
|
||||
*/
|
||||
void
|
||||
intel_region_data(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *dst,
|
||||
static void
|
||||
intel_region_data(struct pipe_context *pipe,
|
||||
struct pipe_region *dst,
|
||||
GLuint dst_offset,
|
||||
GLuint dstx, GLuint dsty,
|
||||
const void *src, GLuint src_pitch,
|
||||
GLuint srcx, GLuint srcy, GLuint width, GLuint height)
|
||||
{
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
@@ -270,20 +278,20 @@ intel_region_data(intelScreenPrivate *intelScreen,
|
||||
if (dst->pbo) {
|
||||
if (dstx == 0 &&
|
||||
dsty == 0 && width == dst->pitch && height == dst->height)
|
||||
intel_region_release_pbo(intelScreen, dst);
|
||||
pipe->region_release_pbo(pipe, dst);
|
||||
else
|
||||
intel_region_cow(intelScreen, dst);
|
||||
pipe->region_cow(pipe, dst);
|
||||
}
|
||||
|
||||
|
||||
LOCK_HARDWARE(intel);
|
||||
|
||||
_mesa_copy_rect(intel_region_map(intelScreen, dst) + dst_offset,
|
||||
_mesa_copy_rect(pipe->region_map(pipe, dst) + dst_offset,
|
||||
dst->cpp,
|
||||
dst->pitch,
|
||||
dstx, dsty, width, height, src, src_pitch, srcx, srcy);
|
||||
|
||||
intel_region_unmap(intelScreen, dst);
|
||||
pipe->region_unmap(pipe, dst);
|
||||
|
||||
UNLOCK_HARDWARE(intel);
|
||||
|
||||
@@ -292,15 +300,16 @@ intel_region_data(intelScreenPrivate *intelScreen,
|
||||
/* Copy rectangular sub-regions. Need better logic about when to
|
||||
* push buffers into AGP - will currently do so whenever possible.
|
||||
*/
|
||||
void
|
||||
intel_region_copy(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *dst,
|
||||
static void
|
||||
intel_region_copy(struct pipe_context *pipe,
|
||||
struct pipe_region *dst,
|
||||
GLuint dst_offset,
|
||||
GLuint dstx, GLuint dsty,
|
||||
struct intel_region *src,
|
||||
const struct pipe_region *src,
|
||||
GLuint src_offset,
|
||||
GLuint srcx, GLuint srcy, GLuint width, GLuint height)
|
||||
{
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
@@ -311,9 +320,9 @@ intel_region_copy(intelScreenPrivate *intelScreen,
|
||||
if (dst->pbo) {
|
||||
if (dstx == 0 &&
|
||||
dsty == 0 && width == dst->pitch && height == dst->height)
|
||||
intel_region_release_pbo(intelScreen, dst);
|
||||
pipe->region_release_pbo(pipe, dst);
|
||||
else
|
||||
intel_region_cow(intelScreen, dst);
|
||||
pipe->region_cow(pipe, dst);
|
||||
}
|
||||
|
||||
assert(src->cpp == dst->cpp);
|
||||
@@ -329,13 +338,14 @@ intel_region_copy(intelScreenPrivate *intelScreen,
|
||||
/* Fill a rectangular sub-region. Need better logic about when to
|
||||
* push buffers into AGP - will currently do so whenever possible.
|
||||
*/
|
||||
void
|
||||
intel_region_fill(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *dst,
|
||||
static void
|
||||
intel_region_fill(struct pipe_context *pipe,
|
||||
struct pipe_region *dst,
|
||||
GLuint dst_offset,
|
||||
GLuint dstx, GLuint dsty,
|
||||
GLuint width, GLuint height, GLuint color)
|
||||
{
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
@@ -346,9 +356,9 @@ intel_region_fill(intelScreenPrivate *intelScreen,
|
||||
if (dst->pbo) {
|
||||
if (dstx == 0 &&
|
||||
dsty == 0 && width == dst->pitch && height == dst->height)
|
||||
intel_region_release_pbo(intelScreen, dst);
|
||||
pipe->region_release_pbo(pipe, dst);
|
||||
else
|
||||
intel_region_cow(intelScreen, dst);
|
||||
pipe->region_cow(pipe, dst);
|
||||
}
|
||||
|
||||
intelEmitFillBlit(intel,
|
||||
@@ -360,16 +370,16 @@ intel_region_fill(intelScreenPrivate *intelScreen,
|
||||
/* Attach to a pbo, discarding our data. Effectively zero-copy upload
|
||||
* the pbo's data.
|
||||
*/
|
||||
void
|
||||
intel_region_attach_pbo(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region,
|
||||
static void
|
||||
intel_region_attach_pbo(struct pipe_context *pipe,
|
||||
struct pipe_region *region,
|
||||
struct intel_buffer_object *pbo)
|
||||
{
|
||||
if (region->pbo == pbo)
|
||||
return;
|
||||
|
||||
/* If there is already a pbo attached, break the cow tie now.
|
||||
* Don't call intel_region_release_pbo() as that would
|
||||
* Don't call pipe_region_release_pbo() as that would
|
||||
* unnecessarily allocate a new buffer we would have to immediately
|
||||
* discard.
|
||||
*/
|
||||
@@ -391,10 +401,11 @@ intel_region_attach_pbo(intelScreenPrivate *intelScreen,
|
||||
|
||||
/* Break the COW tie to the pbo. The pbo gets to keep the data.
|
||||
*/
|
||||
void
|
||||
intel_region_release_pbo(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region)
|
||||
static void
|
||||
intel_region_release_pbo(struct pipe_context *pipe,
|
||||
struct pipe_region *region)
|
||||
{
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
assert(region->buffer == region->pbo->buffer);
|
||||
@@ -415,16 +426,17 @@ intel_region_release_pbo(intelScreenPrivate *intelScreen,
|
||||
/* Break the COW tie to the pbo. Both the pbo and the region end up
|
||||
* with a copy of the data.
|
||||
*/
|
||||
void
|
||||
intel_region_cow(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
static void
|
||||
intel_region_cow(struct pipe_context *pipe, struct pipe_region *region)
|
||||
{
|
||||
intelScreenPrivate *intelScreen = pipe_screen(pipe);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
struct intel_buffer_object *pbo = region->pbo;
|
||||
|
||||
if (intel == NULL)
|
||||
return;
|
||||
|
||||
intel_region_release_pbo(intelScreen, region);
|
||||
pipe->region_release_pbo(pipe, region);
|
||||
|
||||
assert(region->cpp * region->pitch * region->height == pbo->Base.Size);
|
||||
|
||||
@@ -465,16 +477,38 @@ intel_region_cow(intelScreenPrivate *intelScreen, struct intel_region *region)
|
||||
}
|
||||
}
|
||||
|
||||
struct _DriBufferObject *
|
||||
intel_region_buffer(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region, GLuint flag)
|
||||
static struct _DriBufferObject *
|
||||
intel_region_buffer(struct pipe_context *pipe,
|
||||
struct pipe_region *region, GLuint flag)
|
||||
{
|
||||
if (region->pbo) {
|
||||
if (flag == INTEL_WRITE_PART)
|
||||
intel_region_cow(intelScreen, region);
|
||||
pipe->region_cow(pipe, region);
|
||||
else if (flag == INTEL_WRITE_FULL)
|
||||
intel_region_release_pbo(intelScreen, region);
|
||||
pipe->region_release_pbo(pipe, region);
|
||||
}
|
||||
|
||||
return region->buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
intel_init_region_functions(struct pipe_context *pipe)
|
||||
{
|
||||
pipe->region_idle = intel_region_idle;
|
||||
pipe->region_map = intel_region_map;
|
||||
pipe->region_unmap = intel_region_unmap;
|
||||
pipe->region_alloc = intel_region_alloc;
|
||||
pipe->region_release = intel_region_release;
|
||||
pipe->region_create_static = intel_region_create_static;
|
||||
pipe->region_update_static = intel_region_update_static;
|
||||
pipe->region_data = intel_region_data;
|
||||
pipe->region_copy = intel_region_copy;
|
||||
pipe->region_fill = intel_region_fill;
|
||||
pipe->region_cow = intel_region_cow;
|
||||
pipe->region_attach_pbo = intel_region_attach_pbo;
|
||||
pipe->region_release_pbo = intel_region_release_pbo;
|
||||
pipe->region_buffer = intel_region_buffer;
|
||||
}
|
||||
|
||||
|
@@ -31,111 +31,6 @@
|
||||
#include "mtypes.h"
|
||||
#include "intel_screen.h"
|
||||
|
||||
struct intel_context;
|
||||
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
|
||||
{
|
||||
struct _DriBufferObject *buffer; /**< buffer manager's buffer ID */
|
||||
GLuint refcount; /**< Reference count for region */
|
||||
GLuint cpp; /**< bytes per pixel */
|
||||
GLuint pitch; /**< in pixels */
|
||||
GLuint height; /**< in pixels */
|
||||
GLubyte *map; /**< only non-NULL when region is actually mapped */
|
||||
GLuint map_refcount; /**< Reference count for mapping */
|
||||
|
||||
GLuint draw_offset; /**< Offset of drawing address within the region */
|
||||
|
||||
struct intel_buffer_object *pbo; /* zero-copy uploads */
|
||||
};
|
||||
|
||||
|
||||
/* Allocate a refcounted region. Pointers to regions should only be
|
||||
* copied by calling intel_reference_region().
|
||||
*/
|
||||
struct intel_region *intel_region_alloc(intelScreenPrivate *intelScreen,
|
||||
GLuint cpp,
|
||||
GLuint pitch, GLuint height);
|
||||
|
||||
void intel_region_reference(struct intel_region **dst,
|
||||
struct intel_region *src);
|
||||
|
||||
void intel_region_release(struct intel_region **ib);
|
||||
|
||||
extern struct intel_region
|
||||
*intel_region_create_static(intelScreenPrivate *intelScreen,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp,
|
||||
GLuint pitch, GLuint height);
|
||||
extern void
|
||||
intel_region_update_static(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp, GLuint pitch, GLuint height);
|
||||
|
||||
|
||||
void intel_region_idle(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *ib);
|
||||
|
||||
/* Map/unmap regions. This is refcounted also:
|
||||
*/
|
||||
GLubyte *intel_region_map(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *ib);
|
||||
|
||||
void intel_region_unmap(intelScreenPrivate *intelScreen, struct intel_region *ib);
|
||||
|
||||
|
||||
/* Upload data to a rectangular sub-region
|
||||
*/
|
||||
void intel_region_data(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *dest,
|
||||
GLuint dest_offset,
|
||||
GLuint destx, GLuint desty,
|
||||
const void *src, GLuint src_stride,
|
||||
GLuint srcx, GLuint srcy, GLuint width, GLuint height);
|
||||
|
||||
/* Copy rectangular sub-regions
|
||||
*/
|
||||
void intel_region_copy(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *dest,
|
||||
GLuint dest_offset,
|
||||
GLuint destx, GLuint desty,
|
||||
struct intel_region *src,
|
||||
GLuint src_offset,
|
||||
GLuint srcx, GLuint srcy, GLuint width, GLuint height);
|
||||
|
||||
/* Fill a rectangular sub-region
|
||||
*/
|
||||
void intel_region_fill(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *dest,
|
||||
GLuint dest_offset,
|
||||
GLuint destx, GLuint desty,
|
||||
GLuint width, GLuint height, GLuint color);
|
||||
|
||||
/* Helpers for zerocopy uploads, particularly texture image uploads:
|
||||
*/
|
||||
void intel_region_attach_pbo(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region,
|
||||
struct intel_buffer_object *pbo);
|
||||
void intel_region_release_pbo(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region);
|
||||
void intel_region_cow(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region);
|
||||
|
||||
struct _DriBufferObject *intel_region_buffer(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region,
|
||||
GLuint flag);
|
||||
|
||||
#endif
|
||||
|
@@ -35,9 +35,8 @@
|
||||
#include "vblank.h"
|
||||
#include "xmlpool.h"
|
||||
|
||||
|
||||
#include "intel_screen.h"
|
||||
|
||||
#include "intel_batchbuffer.h"
|
||||
#include "intel_buffers.h"
|
||||
#include "intel_tex.h"
|
||||
#include "intel_span.h"
|
||||
@@ -46,8 +45,10 @@
|
||||
|
||||
#include "i830_dri.h"
|
||||
#include "dri_bufpool.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_batchbuffer.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
|
||||
|
||||
PUBLIC const char __driConfigOptions[] =
|
||||
DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE
|
||||
@@ -93,26 +94,27 @@ intelMapScreenRegions(__DRIscreenPrivate * sPriv)
|
||||
}
|
||||
|
||||
|
||||
static struct intel_region *
|
||||
intel_recreate_static(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region,
|
||||
static struct pipe_region *
|
||||
intel_recreate_static(struct pipe_context *pipe,
|
||||
struct pipe_region *region,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp, GLuint pitch, GLuint height)
|
||||
{
|
||||
struct intel_context *intel = 0;
|
||||
if (region) {
|
||||
intel_region_update_static(intelScreen, region, mem_type, offset,
|
||||
virtual, cpp, pitch, height);
|
||||
pipe->region_update_static(pipe, region, mem_type, offset,
|
||||
virtual, cpp, pitch, height);
|
||||
} else {
|
||||
region = intel_region_create_static(intelScreen, mem_type, offset,
|
||||
virtual, cpp, pitch, height);
|
||||
region = pipe->region_create_static(pipe, mem_type, offset,
|
||||
virtual, cpp, pitch, height);
|
||||
}
|
||||
return region;
|
||||
}
|
||||
|
||||
|
||||
/* Create intel_region structs to describe the static front,back,depth
|
||||
/* Create pipe_region structs to describe the static front,back,depth
|
||||
* buffers created by the xserver.
|
||||
* Only used for real front buffer now.
|
||||
*
|
||||
@@ -124,7 +126,7 @@ intel_recreate_static_regions(intelScreenPrivate *intelScreen)
|
||||
{
|
||||
/* this is the real front buffer which is only used for blitting to */
|
||||
intelScreen->front_region =
|
||||
intel_recreate_static(intelScreen,
|
||||
intel_recreate_static(intelScreen->pipe,
|
||||
intelScreen->front_region,
|
||||
DRM_BO_FLAG_MEM_TT,
|
||||
intelScreen->front.offset,
|
||||
|
@@ -25,19 +25,15 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef _INTEL_INIT_H_
|
||||
#define _INTEL_INIT_H_
|
||||
#ifndef _INTEL_SCREEN_H_
|
||||
#define _INTEL_SCREEN_H_
|
||||
|
||||
#include <sys/time.h>
|
||||
#include "dri_util.h"
|
||||
#include "intel_rotate.h"
|
||||
#include "i830_common.h"
|
||||
#include "xmlconfig.h"
|
||||
#include "dri_bufpool.h"
|
||||
|
||||
/* XXX: change name or eliminate to avoid conflict with "struct
|
||||
* intel_region"!!!
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
drm_handle_t handle;
|
||||
@@ -49,9 +45,10 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
struct pipe_context *pipe; /** for accessing region functions */
|
||||
intelRegion front;
|
||||
|
||||
struct intel_region *front_region;
|
||||
struct pipe_region *front_region;
|
||||
|
||||
int deviceID;
|
||||
int width;
|
||||
|
@@ -33,12 +33,13 @@
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_screen.h"
|
||||
#include "intel_span.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_ioctl.h"
|
||||
#include "intel_tex.h"
|
||||
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
/*
|
||||
break intelWriteRGBASpan_ARGB8888
|
||||
*/
|
||||
@@ -187,9 +188,9 @@ intel_map_unmap_buffers(struct intel_context *intel, GLboolean map)
|
||||
/* this is a user-created intel_renderbuffer */
|
||||
if (irb->region) {
|
||||
if (map)
|
||||
intel_region_map(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_map(intel->pipe, irb->region);
|
||||
else
|
||||
intel_region_unmap(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, irb->region);
|
||||
}
|
||||
irb->pfMap = irb->region->map;
|
||||
irb->pfPitch = irb->region->pitch;
|
||||
@@ -220,9 +221,9 @@ intel_map_unmap_buffers(struct intel_context *intel, GLboolean map)
|
||||
irb = intel_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
|
||||
if (irb && irb->region) {
|
||||
if (map)
|
||||
intel_region_map(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_map(intel->pipe, irb->region);
|
||||
else
|
||||
intel_region_unmap(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, irb->region);
|
||||
irb->pfMap = irb->region->map;
|
||||
irb->pfPitch = irb->region->pitch;
|
||||
}
|
||||
@@ -261,12 +262,12 @@ intel_map_unmap_buffers(struct intel_context *intel, GLboolean map)
|
||||
irb = intel_renderbuffer(ctx->DrawBuffer->_DepthBuffer->Wrapped);
|
||||
if (irb && irb->region) {
|
||||
if (map) {
|
||||
intel_region_map(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_map(intel->pipe, irb->region);
|
||||
irb->pfMap = irb->region->map;
|
||||
irb->pfPitch = irb->region->pitch;
|
||||
}
|
||||
else {
|
||||
intel_region_unmap(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, irb->region);
|
||||
irb->pfMap = NULL;
|
||||
irb->pfPitch = 0;
|
||||
}
|
||||
@@ -278,12 +279,12 @@ intel_map_unmap_buffers(struct intel_context *intel, GLboolean map)
|
||||
irb = intel_renderbuffer(ctx->DrawBuffer->_StencilBuffer->Wrapped);
|
||||
if (irb && irb->region) {
|
||||
if (map) {
|
||||
intel_region_map(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_map(intel->pipe, irb->region);
|
||||
irb->pfMap = irb->region->map;
|
||||
irb->pfPitch = irb->region->pitch;
|
||||
}
|
||||
else {
|
||||
intel_region_unmap(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, irb->region);
|
||||
irb->pfMap = NULL;
|
||||
irb->pfPitch = 0;
|
||||
}
|
||||
@@ -312,9 +313,9 @@ intelSpanRenderStart(GLcontext * ctx)
|
||||
/* Just map the framebuffer and all textures. Bufmgr code will
|
||||
* take care of waiting on the necessary fences:
|
||||
*/
|
||||
intel_region_map(intel->intelScreen, intel->front_region);
|
||||
intel_region_map(intel->intelScreen, intel->back_region);
|
||||
intel_region_map(intel->intelScreen, intel->intelScreen->depth_region);
|
||||
intel->pipe->region_map(intel->intelScreen, intel->front_region);
|
||||
intel->pipe->region_map(intel->intelScreen, intel->back_region);
|
||||
intel->pipe->region_map(intel->intelScreen, intel->intelScreen->depth_region);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
|
||||
@@ -342,9 +343,9 @@ intelSpanRenderFinish(GLcontext * ctx)
|
||||
/* Now unmap the framebuffer:
|
||||
*/
|
||||
#if 0
|
||||
intel_region_unmap(intel, intel->front_region);
|
||||
intel_region_unmap(intel, intel->back_region);
|
||||
intel_region_unmap(intel, intel->intelScreen->depth_region);
|
||||
intel->pipe->region_unmap(intel, intel->front_region);
|
||||
intel->pipe->region_unmap(intel, intel->back_region);
|
||||
intel->pipe->region_unmap(intel, intel->intelScreen->depth_region);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
|
||||
|
@@ -36,7 +36,6 @@
|
||||
#include "intel_screen.h"
|
||||
#include "intel_context.h"
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_regions.h"
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
int
|
||||
|
@@ -10,11 +10,11 @@
|
||||
|
||||
#include "intel_context.h"
|
||||
#include "intel_buffers.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_span.h"
|
||||
#include "intel_fbo.h"
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/softpipe/sp_surface.h"
|
||||
|
||||
@@ -173,7 +173,7 @@ map_surface_buffer(struct pipe_buffer *pb, GLuint access_mode)
|
||||
#if 0
|
||||
intelFinish(&intel->ctx); /* XXX need this? */
|
||||
#endif
|
||||
intel_region_map(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_map(intel->pipe, irb->region);
|
||||
}
|
||||
pb->ptr = irb->region->map;
|
||||
|
||||
@@ -194,7 +194,7 @@ unmap_surface_buffer(struct pipe_buffer *pb)
|
||||
if (irb->region) {
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
intel_region_unmap(intel->intelScreen, irb->region);
|
||||
intel->pipe->region_unmap(intel->pipe, irb->region);
|
||||
}
|
||||
pb->ptr = NULL;
|
||||
|
||||
|
@@ -36,7 +36,6 @@
|
||||
#include "intel_batchbuffer.h"
|
||||
#include "intel_buffers.h"
|
||||
#include "intel_mipmap_tree.h"
|
||||
#include "intel_regions.h"
|
||||
#include "intel_fbo.h"
|
||||
#include "intel_tex.h"
|
||||
#include "intel_blit.h"
|
||||
@@ -45,12 +44,12 @@
|
||||
#define FILE_DEBUG_FLAG DEBUG_TEXTURE
|
||||
|
||||
/**
|
||||
* Get the intel_region which is the source for any glCopyTex[Sub]Image call.
|
||||
* Get the pipe_region which is the source for any glCopyTex[Sub]Image call.
|
||||
*
|
||||
* Do the best we can using the blitter. A future project is to use
|
||||
* the texture engine and fragment programs for these copies.
|
||||
*/
|
||||
static const struct intel_region *
|
||||
static const struct pipe_region *
|
||||
get_teximage_source(struct intel_context *intel, GLenum internalFormat)
|
||||
{
|
||||
struct intel_renderbuffer *irb;
|
||||
@@ -92,7 +91,7 @@ do_copy_texsubimage(struct intel_context *intel,
|
||||
GLint x, GLint y, GLsizei width, GLsizei height)
|
||||
{
|
||||
GLcontext *ctx = &intel->ctx;
|
||||
const struct intel_region *src =
|
||||
const struct pipe_region *src =
|
||||
get_teximage_source(intel, internalFormat);
|
||||
|
||||
if (!intelImage->mt || !src) {
|
||||
|
@@ -23,6 +23,8 @@
|
||||
#include "intel_ioctl.h"
|
||||
#include "intel_blit.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_TEXTURE
|
||||
|
||||
/* Functions to store texture images. Where possible, mipmap_tree's
|
||||
@@ -224,8 +226,8 @@ try_pbo_upload(struct intel_context *intel,
|
||||
struct _DriBufferObject *src_buffer =
|
||||
intel_bufferobj_buffer(intel, pbo, INTEL_READ);
|
||||
struct _DriBufferObject *dst_buffer =
|
||||
intel_region_buffer(intel->intelScreen, intelImage->mt->region,
|
||||
INTEL_WRITE_FULL);
|
||||
intel->pipe->region_buffer(intel->pipe, intelImage->mt->region,
|
||||
INTEL_WRITE_FULL);
|
||||
|
||||
|
||||
intelEmitCopyBlit(intel,
|
||||
@@ -281,7 +283,7 @@ try_pbo_zcopy(struct intel_context *intel,
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
intel_region_attach_pbo(intel->intelScreen, intelImage->mt->region, pbo);
|
||||
intel->pipe->region_attach_pbo(intel->pipe, intelImage->mt->region, pbo);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
@@ -411,7 +413,7 @@ intelTexImage(GLcontext * ctx,
|
||||
/* Attempt to texture directly from PBO data (zero copy upload).
|
||||
*
|
||||
* Currently disable as it can lead to worse as well as better
|
||||
* performance (in particular when intel_region_cow() is
|
||||
* performance (in particular when pipe_region_cow() is
|
||||
* required).
|
||||
*/
|
||||
if (intelObj->mt == intelImage->mt &&
|
||||
@@ -460,7 +462,7 @@ intelTexImage(GLcontext * ctx,
|
||||
|
||||
|
||||
if (intelImage->mt)
|
||||
intel_region_idle(intel->intelScreen, intelImage->mt->region);
|
||||
intel->pipe->region_idle(intel->pipe, intelImage->mt->region);
|
||||
|
||||
LOCK_HARDWARE(intel);
|
||||
|
||||
|
@@ -35,6 +35,9 @@
|
||||
#include "intel_tex.h"
|
||||
#include "intel_mipmap_tree.h"
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_TEXTURE
|
||||
|
||||
static void
|
||||
@@ -65,7 +68,7 @@ intelTexSubimage(GLcontext * ctx,
|
||||
return;
|
||||
|
||||
if (intelImage->mt)
|
||||
intel_region_idle(intel->intelScreen, intelImage->mt->region);
|
||||
intel->pipe->region_idle(intel->pipe, intelImage->mt->region);
|
||||
|
||||
LOCK_HARDWARE(intel);
|
||||
|
||||
|
@@ -114,7 +114,86 @@ struct pipe_context {
|
||||
|
||||
void (*set_viewport_state)( struct pipe_context *,
|
||||
const struct pipe_viewport_state * );
|
||||
|
||||
|
||||
/*
|
||||
* Memory region functions
|
||||
* Some of these may go away...
|
||||
*/
|
||||
struct pipe_region *(*region_alloc)(struct pipe_context *pipe,
|
||||
GLuint cpp, GLuint pitch, GLuint height);
|
||||
|
||||
void (*region_release)(struct pipe_context *pipe, struct pipe_region **r);
|
||||
|
||||
struct pipe_region *(*region_create_static)(struct pipe_context *pipe,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp, GLuint pitch,
|
||||
GLuint height);
|
||||
|
||||
void (*region_update_static)(struct pipe_context *pipe,
|
||||
struct pipe_region *region,
|
||||
GLuint mem_type,
|
||||
GLuint offset,
|
||||
void *virtual,
|
||||
GLuint cpp, GLuint pitch, GLuint height);
|
||||
|
||||
void (*region_idle)(struct pipe_context *pipe, struct pipe_region *region);
|
||||
|
||||
GLubyte *(*region_map)(struct pipe_context *pipe, struct pipe_region *r);
|
||||
|
||||
void (*region_unmap)(struct pipe_context *pipe, struct pipe_region *r);
|
||||
|
||||
void (*region_data)(struct pipe_context *pipe,
|
||||
struct pipe_region *dest,
|
||||
GLuint dest_offset,
|
||||
GLuint destx, GLuint desty,
|
||||
const void *src, GLuint src_stride,
|
||||
GLuint srcx, GLuint srcy, GLuint width, GLuint height);
|
||||
|
||||
void (*region_copy)(struct pipe_context *pipe,
|
||||
struct pipe_region *dest,
|
||||
GLuint dest_offset,
|
||||
GLuint destx, GLuint desty,
|
||||
const struct pipe_region *src,
|
||||
GLuint src_offset,
|
||||
GLuint srcx, GLuint srcy, GLuint width, GLuint height);
|
||||
|
||||
void (*region_fill)(struct pipe_context *pipe,
|
||||
struct pipe_region *dst,
|
||||
GLuint dst_offset,
|
||||
GLuint dstx, GLuint dsty,
|
||||
GLuint width, GLuint height, GLuint color);
|
||||
|
||||
void (*region_cow)(struct pipe_context *pipe, struct pipe_region *region);
|
||||
|
||||
void (*region_attach_pbo)(struct pipe_context *pipe,
|
||||
struct pipe_region *region,
|
||||
struct intel_buffer_object *pbo);
|
||||
|
||||
void (*region_release_pbo)(struct pipe_context *pipe,
|
||||
struct pipe_region *region);
|
||||
|
||||
struct _DriBufferObject *(*region_buffer)(struct pipe_context *pipe,
|
||||
struct pipe_region *region,
|
||||
GLuint flag);
|
||||
|
||||
void *screen; /**< temporary */
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
static INLINE void
|
||||
pipe_region_reference(struct pipe_region **dst, struct pipe_region *src)
|
||||
{
|
||||
assert(*dst == NULL);
|
||||
if (src) {
|
||||
src->refcount++;
|
||||
*dst = src;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* PIPE_CONTEXT_H */
|
||||
|
@@ -272,6 +272,24 @@ struct pipe_surface
|
||||
};
|
||||
|
||||
|
||||
struct _DriBufferObject;
|
||||
struct intel_buffer_object;
|
||||
|
||||
struct pipe_region
|
||||
{
|
||||
struct _DriBufferObject *buffer; /**< buffer manager's buffer ID */
|
||||
GLuint refcount; /**< Reference count for region */
|
||||
GLuint cpp; /**< bytes per pixel */
|
||||
GLuint pitch; /**< in pixels */
|
||||
GLuint height; /**< in pixels */
|
||||
GLubyte *map; /**< only non-NULL when region is actually mapped */
|
||||
GLuint map_refcount; /**< Reference count for mapping */
|
||||
|
||||
GLuint draw_offset; /**< Offset of drawing address within the region */
|
||||
|
||||
struct intel_buffer_object *pbo; /* zero-copy uploads */
|
||||
};
|
||||
|
||||
/**
|
||||
* Texture object.
|
||||
* Mipmap levels, cube faces, 3D slices can be accessed as surfaces.
|
||||
|
Reference in New Issue
Block a user