Simplify frontbuffer / sarea / rotation management.

Remove lots of old cruft.
This commit is contained in:
Keith Whitwell
2007-08-03 13:14:27 +01:00
parent 389b1d1a3f
commit b8846a5be9
7 changed files with 95 additions and 251 deletions
@@ -87,7 +87,7 @@ intel_batchbuffer_reset(struct intel_batchbuffer *batch)
* Get a new, free batchbuffer.
*/
batch->size = batch->intel->intelScreen->maxBatchSize;
batch->size = BATCH_SZ;
driBOData(batch->buffer, batch->size, NULL, 0);
driBOResetList(&batch->list);
+8 -9
View File
@@ -86,8 +86,6 @@ intelCopyBuffer(__DRIdrawablePrivate * dPriv,
if (dPriv && dPriv->numClipRects) {
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
const struct pipe_region *frontRegion
= intelScreen->front_region;
const struct pipe_region *backRegion
= intel_fb->Base._ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT ?
intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT) :
@@ -96,20 +94,19 @@ intelCopyBuffer(__DRIdrawablePrivate * dPriv,
const int backHeight = intel_fb->Base.Height;
const int nbox = dPriv->numClipRects;
const drm_clip_rect_t *pbox = dPriv->pClipRects;
const int pitch = frontRegion->pitch;
const int pitch = intelScreen->front.pitch / intelScreen->front.cpp;
const int srcpitch = backRegion->pitch;
const int cpp = frontRegion->cpp;
const int cpp = intelScreen->front.cpp;
int BR13, CMD;
int i;
ASSERT(intel_fb);
ASSERT(intel_fb->Base.Name == 0); /* Not a user-created FBO */
ASSERT(frontRegion);
ASSERT(backRegion);
ASSERT(frontRegion->cpp == backRegion->cpp);
ASSERT(backRegion->cpp == cpp);
DBG("front pitch %d back pitch %d\n",
frontRegion->pitch, backRegion->pitch);
pitch, backRegion->pitch);
if (cpp == 2) {
BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24);
@@ -127,7 +124,8 @@ intelCopyBuffer(__DRIdrawablePrivate * dPriv,
if (pbox->x1 > pbox->x2 ||
pbox->y1 > pbox->y2 ||
pbox->x2 > intelScreen->width || pbox->y2 > intelScreen->height)
pbox->x2 > intelScreen->front.width ||
pbox->y2 > intelScreen->front.height)
continue;
box = *pbox;
@@ -170,7 +168,8 @@ intelCopyBuffer(__DRIdrawablePrivate * dPriv,
OUT_BATCH((box.y1 << 16) | box.x1);
OUT_BATCH((box.y2 << 16) | box.x2);
OUT_RELOC(frontRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
OUT_RELOC(intelScreen->front.buffer,
DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
OUT_BATCH((sbox.y1 << 16) | sbox.x1);
OUT_BATCH((srcpitch * cpp) & 0xffff);
+4 -13
View File
@@ -337,8 +337,7 @@ intelCreateContext(const __GLcontextModes * mesaVis,
GLcontext *shareCtx = (GLcontext *) sharedContextPrivate;
__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
drmI830Sarea *saPriv = (drmI830Sarea *)
(((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset);
drmI830Sarea *saPriv = intelScreen->sarea;
int fthrottle_mode;
GLboolean havePools;
@@ -409,7 +408,6 @@ intelCreateContext(const __GLcontextModes * mesaVis,
intel->pipe = intel->ctx.st->pipe;
intel->pipe->screen = intelScreen;
intel->pipe->glctx = ctx;
intelScreen->pipe = intel->pipe;
intel_init_region_functions(intel->pipe);
/*
@@ -453,11 +451,6 @@ intelCreateContext(const __GLcontextModes * mesaVis,
intel->iw.irq_seq = -1;
intel->irqsEmitted = 0;
intel->do_irqs = (intel->intelScreen->irq_active &&
fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS);
intel->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
_math_matrix_ctr(&intel->ViewportMatrix);
/* Disable imaging extension until convolution is working in
@@ -598,9 +591,7 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
if (driDrawPriv->pdraw->swap_interval == (unsigned)-1) {
int i;
intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
? driGetDefaultVBlankFlags(&intel->optionCache)
: VBLANK_FLAG_NO_IRQ;
intel_fb->vblank_flags = driGetDefaultVBlankFlags(&intel->optionCache);
(*dri_interface->getUST) (&intel_fb->swap_ust);
driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
@@ -651,8 +642,8 @@ intelContendedLock(struct intel_context *intel, GLuint flags)
if (dPriv)
DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
if (sarea->width != intelScreen->width ||
sarea->height != intelScreen->height) {
if (sarea->width != intelScreen->front.width ||
sarea->height != intelScreen->front.height) {
intelUpdateScreenRotation(sPriv, sarea);
}
+58 -193
View File
@@ -65,106 +65,8 @@ PUBLIC const char __driConfigOptions[] =
extern const struct dri_extension card_extensions[];
/**
* Map all the memory regions described by the screen.
* \return GL_TRUE if success, GL_FALSE if error.
*/
GLboolean
intelMapScreenRegions(__DRIscreenPrivate * sPriv)
{
intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
if (intelScreen->front.handle) {
if (drmMap(sPriv->fd,
intelScreen->front.handle,
intelScreen->front.size,
(drmAddress *) & intelScreen->front.map) != 0) {
_mesa_problem(NULL, "drmMap(frontbuffer) failed!");
return GL_FALSE;
}
}
else {
_mesa_warning(NULL, "no front buffer handle in intelMapScreenRegions!");
}
if (0)
printf("Mappings: front: %p\n", intelScreen->front.map);
return GL_TRUE;
}
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)
{
if (region) {
pipe->region_update_static(pipe, region, mem_type, offset,
virtual, cpp, pitch, height);
} else {
region = pipe->region_create_static(pipe, mem_type, offset,
virtual, cpp, pitch, height);
}
return region;
}
/* Create pipe_region structs to describe the static front,back,depth
* buffers created by the xserver.
* Only used for real front buffer now.
*
* Note that these don't allocate video memory, just describe
* allocations already made by the X server.
*/
static void
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->pipe,
intelScreen->front_region,
DRM_BO_FLAG_MEM_TT,
intelScreen->front.offset,
intelScreen->front.map,
intelScreen->cpp,
intelScreen->front.pitch / intelScreen->cpp,
intelScreen->height);
}
/**
* Use the information in the sarea to update the screen parameters
* related to screen rotation. Needs to be called locked.
*/
void
intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea)
{
intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
intelUnmapScreenRegions(intelScreen);
intelUpdateScreenFromSAREA(intelScreen, sarea);
if (!intelMapScreenRegions(sPriv)) {
fprintf(stderr, "ERROR Remapping screen regions!!!\n");
}
intel_recreate_static_regions(intelScreen);
}
void
intelUnmapScreenRegions(intelScreenPrivate * intelScreen)
{
#define REALLY_UNMAP 1
if (intelScreen->front.map) {
#if REALLY_UNMAP
if (drmUnmap(intelScreen->front.map, intelScreen->front.size) != 0)
printf("drmUnmap front failed!\n");
#endif
intelScreen->front.map = NULL;
}
}
static void
@@ -205,26 +107,60 @@ intelPrintSAREA(const drmI830Sarea * sarea)
}
/**
* A number of the screen parameters are obtained/computed from
* information in the SAREA. This function updates those parameters.
* Use the information in the sarea to update the screen parameters
* related to screen rotation. Needs to be called locked.
*/
void
intelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
drmI830Sarea * sarea)
intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea)
{
intelScreen->width = sarea->width;
intelScreen->height = sarea->height;
intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
if (intelScreen->front.map) {
drmUnmap(intelScreen->front.map, intelScreen->front.size);
intelScreen->front.map = NULL;
}
if (intelScreen->front.buffer)
driDeleteBuffers(1, &intelScreen->front.buffer);
intelScreen->front.width = sarea->width;
intelScreen->front.height = sarea->height;
intelScreen->front.offset = sarea->front_offset;
intelScreen->front.pitch = sarea->pitch * intelScreen->cpp;
intelScreen->front.handle = sarea->front_handle;
intelScreen->front.pitch = sarea->pitch * intelScreen->front.cpp;
intelScreen->front.size = sarea->front_size;
intelScreen->front.handle = sarea->front_handle;
if (0)
intelPrintSAREA(sarea);
assert( sarea->front_size >=
intelScreen->front.pitch * intelScreen->front.height );
if (!sarea->front_handle)
return;
if (drmMap(sPriv->fd,
sarea->front_handle,
intelScreen->front.size,
(drmAddress *) & intelScreen->front.map) != 0) {
_mesa_problem(NULL, "drmMap(frontbuffer) failed!");
return;
}
if (intelScreen->staticPool) {
driGenBuffers(intelScreen->staticPool, "static region", 1,
&intelScreen->front.buffer, 64,
DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_NO_MOVE |
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0);
driBOSetStatic(intelScreen->front.buffer,
intelScreen->front.offset,
intelScreen->front.pitch * intelScreen->front.height,
intelScreen->front.map, 0);
}
}
GLboolean
intelCreatePools(intelScreenPrivate *intelScreen)
{
@@ -234,7 +170,7 @@ intelCreatePools(intelScreenPrivate *intelScreen)
if (intelScreen->havePools)
return GL_TRUE;
batchPoolSize /= intelScreen->maxBatchSize;
batchPoolSize /= BATCH_SZ;
intelScreen->regionPool = driDRMPoolInit(sPriv->fd);
if (!intelScreen->regionPool)
@@ -251,16 +187,17 @@ intelCreatePools(intelScreenPrivate *intelScreen)
DRM_BO_FLAG_EXE |
DRM_BO_FLAG_MEM_TT |
DRM_BO_FLAG_MEM_LOCAL,
intelScreen->maxBatchSize,
BATCH_SZ,
batchPoolSize, 5);
if (!intelScreen->batchPool) {
fprintf(stderr, "Failed to initialize batch pool - possible incorrect agpgart installed\n");
return GL_FALSE;
}
intel_recreate_static_regions(intelScreen);
intelScreen->havePools = GL_TRUE;
intelUpdateScreenRotation(sPriv, intelScreen->sarea);
return GL_TRUE;
}
@@ -270,7 +207,6 @@ intelInitDriver(__DRIscreenPrivate * sPriv)
{
intelScreenPrivate *intelScreen;
I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv;
drmI830Sarea *sarea;
PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
(PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->
@@ -285,87 +221,30 @@ intelInitDriver(__DRIscreenPrivate * sPriv)
/* Allocate the private area */
intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));
if (!intelScreen) {
fprintf(stderr, "\nERROR! Allocating private area failed\n");
if (!intelScreen)
return GL_FALSE;
}
/* parse information in __driConfigOptions */
driParseOptionInfo(&intelScreen->optionCache,
__driConfigOptions, __driNConfigOptions);
intelScreen->driScrnPriv = sPriv;
sPriv->private = (void *) intelScreen;
intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;
sarea = (drmI830Sarea *)
(((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset);
intelScreen->maxBatchSize = BATCH_SZ;
intelScreen->sarea = (drmI830Sarea *) (((GLubyte *) sPriv->pSAREA) +
gDRIPriv->sarea_priv_offset);
intelScreen->deviceID = gDRIPriv->deviceID;
if (intelScreen->deviceID == PCI_CHIP_I865_G)
intelScreen->maxBatchSize = 4096;
intelScreen->front.cpp = gDRIPriv->cpp;
intelScreen->drmMinor = sPriv->drmMinor;
intelScreen->mem = gDRIPriv->mem;
intelScreen->cpp = gDRIPriv->cpp;
assert(gDRIPriv->bitsPerPixel == 16 ||
gDRIPriv->bitsPerPixel == 32);
switch (gDRIPriv->bitsPerPixel) {
case 16:
break;
case 32:
break;
default:
exit(1);
break;
}
intelUpdateScreenFromSAREA(intelScreen, sarea);
if (!intelMapScreenRegions(sPriv)) {
fprintf(stderr, "\nERROR! mapping regions\n");
_mesa_free(intelScreen);
sPriv->private = NULL;
return GL_FALSE;
}
intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;
intelUpdateScreenRotation(sPriv, intelScreen->sarea);
if (0)
intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv);
intelScreen->drmMinor = sPriv->drmMinor;
/* Determine if IRQs are active? */
{
int ret;
drmI830GetParam gp;
gp.param = I830_PARAM_IRQ_ACTIVE;
gp.value = &intelScreen->irq_active;
ret = drmCommandWriteRead(sPriv->fd, DRM_I830_GETPARAM,
&gp, sizeof(gp));
if (ret) {
fprintf(stderr, "drmI830GetParam: %d\n", ret);
return GL_FALSE;
}
}
/* Determine if batchbuffers are allowed */
{
int ret;
drmI830GetParam gp;
gp.param = I830_PARAM_ALLOW_BATCHBUFFER;
gp.value = &intelScreen->allow_batchbuffer;
ret = drmCommandWriteRead(sPriv->fd, DRM_I830_GETPARAM,
&gp, sizeof(gp));
if (ret) {
fprintf(stderr, "drmI830GetParam: (%d) %d\n", gp.param, ret);
return GL_FALSE;
}
}
if (glx_enable_extension != NULL) {
(*glx_enable_extension) (psc, "GLX_SGI_swap_control");
(*glx_enable_extension) (psc, "GLX_SGI_video_sync");
@@ -383,7 +262,7 @@ intelDestroyScreen(__DRIscreenPrivate * sPriv)
{
intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
intelUnmapScreenRegions(intelScreen);
// intelUnmapScreenRegions(intelScreen);
if (intelScreen->havePools) {
driPoolTakeDown(intelScreen->regionPool);
@@ -403,10 +282,6 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
__DRIdrawablePrivate * driDrawPriv,
const __GLcontextModes * mesaVis, GLboolean isPixmap)
{
#if 0
intelScreenPrivate *screen = (intelScreenPrivate *) driScrnPriv->private;
#endif
if (isPixmap) {
return GL_FALSE; /* not implemented */
}
@@ -437,16 +312,6 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
= intel_new_renderbuffer_fb(rgbFormat);
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
&intel_fb->color_rb[1]->Base);
#if 0
if (screen->third.handle) {
struct gl_renderbuffer *tmp_rb = NULL;
intel_fb->color_rb[2]
= intel_new_renderbuffer_fb(rgbFormat);
_mesa_reference_renderbuffer(&tmp_rb, &intel_fb->color_rb[2]->Base);
}
#endif
}
if (mesaVis->depthBits == 24 && mesaVis->stencilBits == 8) {
+22 -33
View File
@@ -33,37 +33,30 @@
#include "xmlconfig.h"
#include "dri_bufpool.h"
typedef struct
{
drm_handle_t handle;
drmSize size; /* region size in bytes */
char *map; /* memory map */
int offset; /* from start of video mem, in bytes */
int pitch; /* row stride, in bytes */
} intelRegion;
typedef struct
struct intel_screen
{
struct pipe_context *pipe; /** for accessing region functions */
intelRegion front;
struct {
drm_handle_t handle;
struct pipe_region *front_region;
/* We create a static dri buffer for the frontbuffer.
*/
struct _DriBufferObject *buffer;
char *map; /* memory map */
int offset; /* from start of video mem, in bytes */
int pitch; /* row stride, in bytes */
int width;
int height;
int size;
int cpp; /* for front and back buffers */
} front;
int deviceID;
int width;
int height;
int mem; /* unused */
int cpp; /* for front and back buffers */
__DRIscreenPrivate *driScrnPriv;
unsigned int sarea_priv_offset;
int drmMinor;
int irq_active;
int allow_batchbuffer;
__DRIscreenPrivate *driScrnPriv;
drmI830Sarea *sarea;
/**
@@ -74,20 +67,16 @@ typedef struct
struct _DriBufferPool *texPool;
struct _DriBufferPool *regionPool;
struct _DriBufferPool *staticPool;
unsigned int maxBatchSize;
GLboolean havePools;
struct intel_context *dummyctxptr;
} intelScreenPrivate;
};
extern GLboolean intelMapScreenRegions(__DRIscreenPrivate * sPriv);
extern void intelUnmapScreenRegions(intelScreenPrivate * intelScreen);
typedef struct intel_screen intelScreenPrivate;
extern void
intelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
drmI830Sarea * sarea);
intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea);
extern void intelDestroyContext(__DRIcontextPrivate * driContextPriv);
@@ -74,7 +74,7 @@ get_teximage_source(struct intel_context *intel, GLenum internalFormat)
case GL_RGBA8:
return intel_readbuf_region(intel);
case GL_RGB:
if (intel->intelScreen->cpp == 2)
if (intel->intelScreen->front.cpp == 2)
return intel_readbuf_region(intel);
return NULL;
default:
@@ -16,7 +16,7 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,
GLenum format, GLenum type)
{
struct intel_context *intel = intel_context(ctx);
const GLboolean do32bpt = (intel->intelScreen->cpp == 4);
const GLboolean do32bpt = (intel->intelScreen->front.cpp == 4);
switch (internalFormat) {
case 4: