struct pipe_buffer goes away.
Added basic region functions to softpipe to allocate/release malloc'd regions.
Surface-related code is fairly coherent now.
rb->Width = width;
rb->Height = height;
-#if 1
/* update the surface's size too */
rb->surface->width = width;
rb->surface->height = height;
-#endif
+ rb->surface->region = irb->region;
/* This sets the Get/PutRow/Value functions */
intel_set_span_functions(&irb->Base);
read_quad_f_swz(struct softpipe_surface *sps, GLint x, GLint y,
GLfloat (*rrrr)[QUAD_SIZE])
{
- const GLint bytesPerRow = sps->surface.stride * sps->surface.cpp;
+ const GLint bytesPerRow = sps->surface.region->pitch * sps->surface.region->cpp;
const GLint invY = sps->surface.height - y - 1;
- const GLubyte *src = sps->surface.ptr + invY * bytesPerRow + x * sps->surface.cpp;
+ const GLubyte *src = sps->surface.region->map + invY * bytesPerRow + x * sps->surface.region->cpp;
GLfloat *dst = (GLfloat *) rrrr;
GLubyte temp[16];
GLuint j;
GLfloat (*rrrr)[QUAD_SIZE])
{
const GLfloat *src = (const GLfloat *) rrrr;
- const GLint bytesPerRow = sps->surface.stride * sps->surface.cpp;
+ const GLint bytesPerRow = sps->surface.region->pitch * sps->surface.region->cpp;
const GLint invY = sps->surface.height - y - 1;
- GLubyte *dst = sps->surface.ptr + invY * bytesPerRow + x * sps->surface.cpp;
+ GLubyte *dst = sps->surface.region->map + invY * bytesPerRow + x * sps->surface.region->cpp;
GLubyte temp[16];
GLuint j;
static const GLuint mask = 0xffffff;
const GLint invY = sps->surface.height - y - 1;
const GLuint *src
- = (GLuint *) (sps->surface.ptr
- + (invY * sps->surface.stride + x) * sps->surface.cpp);
+ = (GLuint *) (sps->surface.region->map
+ + (invY * sps->surface.region->pitch + x) * sps->surface.region->cpp);
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
/* extract lower three bytes */
zzzz[0] = src[0] & mask;
zzzz[1] = src[1] & mask;
- zzzz[2] = src[-sps->surface.stride] & mask;
- zzzz[3] = src[-sps->surface.stride + 1] & mask;
+ zzzz[2] = src[-sps->surface.region->pitch] & mask;
+ zzzz[3] = src[-sps->surface.region->pitch + 1] & mask;
}
static void
static const GLuint mask = 0xff000000;
const GLint invY = sps->surface.height - y - 1;
GLuint *dst
- = (GLuint *) (sps->surface.ptr
- + (invY * sps->surface.stride + x) * sps->surface.cpp);
+ = (GLuint *) (sps->surface.region->map
+ + (invY * sps->surface.region->pitch + x) * sps->surface.region->cpp);
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
/* write lower three bytes */
dst[0] = (dst[0] & mask) | zzzz[0];
dst[1] = (dst[1] & mask) | zzzz[1];
- dst -= sps->surface.stride;
+ dst -= sps->surface.region->pitch;
dst[0] = (dst[0] & mask) | zzzz[2];
dst[1] = (dst[1] & mask) | zzzz[3];
}
GLint x, GLint y, GLubyte ssss[QUAD_SIZE])
{
const GLint invY = sps->surface.height - y - 1;
- const GLuint *src = (const GLuint *) (sps->surface.ptr
- + (invY * sps->surface.stride + x) * sps->surface.cpp);
+ const GLuint *src = (const GLuint *) (sps->surface.region->map
+ + (invY * sps->surface.region->pitch + x) * sps->surface.region->cpp);
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
/* extract high byte */
ssss[0] = src[0] >> 24;
ssss[1] = src[1] >> 24;
- src -= sps->surface.stride;
+ src -= sps->surface.region->pitch;
ssss[2] = src[0] >> 24;
ssss[3] = src[1] >> 24;
}
{
static const GLuint mask = 0x00ffffff;
const GLint invY = sps->surface.height - y - 1;
- GLuint *dst = (GLuint *) (sps->surface.ptr
- + (invY * sps->surface.stride + x) * sps->surface.cpp);
+ GLuint *dst = (GLuint *) (sps->surface.region->map
+ + (invY * sps->surface.region->pitch + x) * sps->surface.region->cpp);
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
/* write high byte */
dst[0] = (dst[0] & mask) | (ssss[0] << 24);
dst[1] = (dst[1] & mask) | (ssss[1] << 24);
- dst -= sps->surface.stride;
+ dst -= sps->surface.region->pitch;
dst[0] = (dst[0] & mask) | (ssss[2] << 24);
dst[1] = (dst[1] & mask) | (ssss[3] << 24);
}
-static void *
-map_surface_buffer(struct pipe_buffer *pb, GLuint access_mode)
-{
- struct softpipe_surface *sps = (struct softpipe_surface *) pb;
- struct intel_renderbuffer *irb = (struct intel_renderbuffer *) sps->surface.rb;
- assert(access_mode == PIPE_MAP_READ_WRITE);
-
- /*LOCK_HARDWARE(intel);*/
-
- if (irb->region) {
- GET_CURRENT_CONTEXT(ctx);
- struct intel_context *intel = intel_context(ctx);
-#if 0
- intelFinish(&intel->ctx); /* XXX need this? */
-#endif
- intel->pipe->region_map(intel->pipe, irb->region);
- }
- pb->ptr = irb->region->map;
-
- sps->surface.stride = irb->region->pitch;
- sps->surface.cpp = irb->region->cpp;
- sps->surface.ptr = irb->region->map;
-
- return pb->ptr;
-}
-
-
-static void
-unmap_surface_buffer(struct pipe_buffer *pb)
-{
- struct softpipe_surface *sps = (struct softpipe_surface *) pb;
- struct intel_renderbuffer *irb = (struct intel_renderbuffer *) sps->surface.rb;
-
- if (irb->region) {
- GET_CURRENT_CONTEXT(ctx);
- struct intel_context *intel = intel_context(ctx);
- intel->pipe->region_unmap(intel->pipe, irb->region);
- }
- pb->ptr = NULL;
-
- sps->surface.stride = 0;
- sps->surface.cpp = 0;
- sps->surface.ptr = NULL;
-
- /*UNLOCK_HARDWARE(intel);*/
-}
-
-
struct pipe_surface *
intel_new_surface(GLuint intFormat)
{
}
- sps->surface.buffer.map = map_surface_buffer;
- sps->surface.buffer.unmap = unmap_surface_buffer;
-
return &sps->surface;
}
rb->Height = height;
rb->InternalFormat = internalFormat;
- rb->surface->resize(rb->surface, width, height);
+ if (!xrb->Base.surface)
+ xrb->Base.surface = xmesa_new_surface(ctx, xrb);
+ xrb->Base.surface->width = width;
+ xrb->Base.surface->height = height;
return GL_TRUE;
}
xrb->origin4 = NULL;
}
- rb->surface->resize(rb->surface, width, height);
+ if (!xrb->Base.surface)
+ xrb->Base.surface = xmesa_new_surface(ctx, xrb);
+ xrb->Base.surface->width = width;
+ xrb->Base.surface->height = height;
return GL_TRUE;
}
xrb->Base.IndexBits = visual->indexBits;
}
/* only need to set Red/Green/EtcBits fields for user-created RBs */
-
- xrb->Base.surface = xmesa_new_surface(xrb);
-
}
return xrb;
}
#include "framebuffer.h"
#include "renderbuffer.h"
-#include "pipe/p_state.h"
+#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/softpipe/sp_context.h"
#include "pipe/softpipe/sp_surface.h"
-
-
-static void *
-map_surface_buffer(struct pipe_buffer *pb, GLuint access_mode)
-{
- /* no-op */
- return NULL;
-}
-
-
-static void
-unmap_surface_buffer(struct pipe_buffer *pb)
-{
- /* no-op */
-}
+#include "state_tracker/st_context.h"
static INLINE struct xmesa_renderbuffer *
}
-static void
-resize_surface(struct pipe_surface *ps, GLuint width, GLuint height)
-{
- ps->width = width;
- ps->height = height;
-}
-
-
/**
* Called to create a pipe_surface for each X renderbuffer.
+ * Note: this is being used instead of pipe->surface_alloc() since we
+ * have special/unique quad read/write functions for X.
*/
struct pipe_surface *
-xmesa_new_surface(struct xmesa_renderbuffer *xrb)
+xmesa_new_surface(GLcontext *ctx, struct xmesa_renderbuffer *xrb)
{
+ struct pipe_context *pipe = ctx->st->pipe;
struct softpipe_surface *sps;
sps = CALLOC_STRUCT(softpipe_surface);
if (!sps)
return NULL;
- sps->surface.rb = xrb;
+ sps->surface.rb = xrb; /* XXX only needed for quad funcs above */
sps->surface.width = xrb->Base.Width;
sps->surface.height = xrb->Base.Height;
sps->write_quad_ub = write_quad_ub;
sps->write_mono_row_ub = write_mono_row_ub;
- sps->surface.buffer.map = map_surface_buffer;
- sps->surface.buffer.unmap = unmap_surface_buffer;
- sps->surface.resize = resize_surface;
+ /* Note, the region we allocate doesn't actually have any storage
+ * since we're drawing into an XImage or Pixmap.
+ * The region's size will get set in the xmesa_alloc_front/back_storage()
+ * functions.
+ */
+ sps->surface.region = pipe->region_alloc(pipe, 0, 0, 0);
return &sps->surface;
}
struct pipe_surface;
struct pipe_surface *
-xmesa_new_surface(struct xmesa_renderbuffer *xrb);
+xmesa_new_surface(GLcontext *ctx, struct xmesa_renderbuffer *xrb);
#endif
#include "pipe/softpipe/sp_z_surface.h"
#include "pipe/p_state.h"
+#include "pipe/p_context.h"
#include "pipe/p_defines.h"
+#include "state_tracker/st_context.h"
/* 32-bit color index format. Not a public format. */
GLenum internalFormat,
GLuint width, GLuint height)
{
+ struct pipe_context *pipe = ctx->st->pipe;
GLuint pixelSize;
/* first clear these fields */
rb->PutMonoValues = put_mono_values_ubyte;
rb->StencilBits = 8 * sizeof(GLubyte);
pixelSize = sizeof(GLubyte);
+ if (!rb->surface)
+ rb->surface = (struct pipe_surface *)
+ pipe->surface_alloc(pipe, PIPE_FORMAT_U_S8);
break;
case GL_STENCIL_INDEX16_EXT:
rb->_ActualFormat = GL_STENCIL_INDEX16_EXT;
rb->PutValues = put_values_ushort;
rb->PutMonoValues = put_mono_values_ushort;
rb->DepthBits = 8 * sizeof(GLushort);
- rb->surface
- = (struct pipe_surface *) softpipe_new_z_surface(PIPE_FORMAT_U_Z16);
+ if (!rb->surface)
+ rb->surface = (struct pipe_surface *)
+ pipe->surface_alloc(pipe, PIPE_FORMAT_U_Z16);
pixelSize = sizeof(GLushort);
break;
case GL_DEPTH_COMPONENT24:
rb->_ActualFormat = GL_DEPTH_COMPONENT32;
rb->DepthBits = 32;
}
- rb->surface
- = (struct pipe_surface *) softpipe_new_z_surface(PIPE_FORMAT_U_Z32);
+ if (!rb->surface)
+ rb->surface = (struct pipe_surface *)
+ pipe->surface_alloc(pipe, PIPE_FORMAT_U_Z32);
pixelSize = sizeof(GLuint);
break;
case GL_DEPTH_STENCIL_EXT:
rb->PutMonoValues = put_mono_values_uint;
rb->DepthBits = 24;
rb->StencilBits = 8;
- rb->surface
- = (struct pipe_surface *) softpipe_new_z_surface(PIPE_FORMAT_Z24_S8);
+ if (!rb->surface)
+ rb->surface = (struct pipe_surface *)
+ pipe->surface_alloc(pipe, PIPE_FORMAT_Z24_S8);
pixelSize = sizeof(GLuint);
break;
case GL_COLOR_INDEX8_EXT:
ASSERT(rb->PutMonoValues);
/* free old buffer storage */
- if (rb->Data) {
- if (rb->surface) {
- /* pipe surface */
- }
- else {
- /* legacy renderbuffer */
- _mesa_free(rb->Data);
- }
- rb->Data = NULL;
+ if (rb->surface) {
+ /* pipe_surface/region */
}
+ else if (rb->Data) {
+ /* legacy renderbuffer (this will go away) */
+ _mesa_free(rb->Data);
+ }
+ rb->Data = NULL;
if (width > 0 && height > 0) {
/* allocate new buffer storage */
if (rb->surface) {
- /* pipe surface */
- rb->surface->resize(rb->surface, width, height);
- rb->Data = rb->surface->buffer.ptr;
+ /* pipe_surface/region */
+ if (rb->surface->region) {
+ pipe->region_unmap(pipe, rb->surface->region);
+ pipe->region_release(pipe, &rb->surface->region);
+ }
+ rb->surface->region = pipe->region_alloc(pipe, pixelSize, width, height);
+ /* XXX probably don't want to really map here */
+ pipe->region_map(pipe, rb->surface->region);
+ rb->Data = rb->surface->region->map;
}
else {
- /* legacy renderbuffer */
- rb->Data = _mesa_malloc(width * height * pixelSize);
+ /* legacy renderbuffer (this will go away) */
+ rb->Data = malloc(width * height * pixelSize);
}
+
if (rb->Data == NULL) {
rb->Width = 0;
rb->Height = 0;
const struct pipe_viewport_state * );
+ /*
+ * Surface functions
+ * This might go away...
+ */
+ struct pipe_surface *(*surface_alloc)(struct pipe_context *pipe,
+ GLuint format);
+
+
/*
* Memory region functions
* Some of these may go away...
/***
- *** Non-state Objects
+ *** Resource Objects
***/
-/**
- * A mappable buffer (vertex data, pixel data, etc)
- * XXX replace with "intel_region".
- */
-struct pipe_buffer
-{
- void (*buffer_data)(struct pipe_buffer *pb, GLuint size, const void *src);
- void (*buffer_sub_data)(struct pipe_buffer *pb, GLuint offset, GLuint size,
- const void *src);
- void *(*map)(struct pipe_buffer *pb, GLuint access_mode);
- void (*unmap)(struct pipe_buffer *pb);
- GLubyte *ptr; /**< address, only valid while mapped */
- GLuint mode; /**< PIPE_MAP_x, only valid while mapped */
-};
-
-
-/**
- * 2D surface.
- * May be a renderbuffer, texture mipmap level, etc.
- */
-struct pipe_surface
-{
- struct pipe_buffer buffer; /**< surfaces can be mapped */
- GLuint format:5; /**< PIPE_FORMAT_x */
- GLuint width, height;
-
- GLint stride, cpp;
- GLubyte *ptr; /**< only valid while mapped, may not equal buffer->ptr */
-
- void *rb; /**< Ptr back to renderbuffer (temporary?) */
-
- void (*resize)(struct pipe_surface *ps, GLuint width, GLuint height);
-};
-
-
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 */
struct intel_buffer_object *pbo; /* zero-copy uploads */
};
+
+/**
+ * 2D surface.
+ * May be a renderbuffer, texture mipmap level, etc.
+ */
+struct pipe_surface
+{
+ struct pipe_region *region;
+ GLuint format:5; /**< PIPE_FORMAT_x */
+ GLuint width, height;
+
+ void *rb; /**< Ptr back to renderbuffer (temporary?) */
+};
+
+
/**
* Texture object.
* Mipmap levels, cube faces, 3D slices can be accessed as surfaces.
#include "pipe/p_defines.h"
#include "sp_context.h"
#include "sp_clear.h"
+#include "sp_region.h"
#include "sp_state.h"
#include "sp_surface.h"
#include "sp_prim_setup.h"
static void map_surfaces(struct softpipe_context *sp)
{
+ struct pipe_context *pipe = &sp->pipe;
GLuint i;
for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
- struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.cbufs[i]);
- struct pipe_buffer *buf = &sps->surface.buffer;
- buf->map(buf, PIPE_MAP_READ_WRITE);
+ struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.cbufs[i]); pipe->region_map(pipe, sps->surface.region);
}
if (sp->framebuffer.zbuf) {
struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.zbuf);
- struct pipe_buffer *buf = &sps->surface.buffer;
- buf->map(buf, PIPE_MAP_READ_WRITE);
+ pipe->region_map(pipe, sps->surface.region);
}
/* XXX depth & stencil bufs */
static void unmap_surfaces(struct softpipe_context *sp)
{
+ struct pipe_context *pipe = &sp->pipe;
GLuint i;
for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.cbufs[i]);
- struct pipe_buffer *buf = &sps->surface.buffer;
- buf->unmap(buf);
+ pipe->region_unmap(pipe, sps->surface.region);
}
if (sp->framebuffer.zbuf) {
struct softpipe_surface *sps = softpipe_surface(sp->framebuffer.zbuf);
- struct pipe_buffer *buf = &sps->surface.buffer;
- buf->unmap(buf);
+ pipe->region_unmap(pipe, sps->surface.region);
}
/* XXX depth & stencil bufs */
}
softpipe->draw = draw_create();
draw_set_setup_stage(softpipe->draw, sp_draw_render_stage(softpipe));
+ sp_init_region_functions(softpipe);
+ sp_init_surface_functions(softpipe);
+
/*
* XXX we could plug GL selection/feedback into the drawing pipeline
* by specifying a different setup/render stage.
--- /dev/null
+/**************************************************************************
+ *
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+/**
+ * Software-based region allocation and management.
+ * A hardware driver would override these functions.
+ */
+
+
+#include "sp_context.h"
+#include "sp_region.h"
+#include "sp_surface.h"
+#include "main/imports.h"
+
+
+static struct pipe_region *
+sp_region_alloc(struct pipe_context *pipe,
+ GLuint cpp, GLuint pitch, GLuint height)
+{
+ struct pipe_region *region = CALLOC_STRUCT(pipe_region);
+ if (!region)
+ return NULL;
+
+ region->refcount = 1;
+ region->cpp = cpp;
+ region->pitch = pitch;
+ region->height = height;
+ region->map = malloc(cpp * pitch * height);
+
+ return region;
+}
+
+
+static void
+sp_region_release(struct pipe_context *pipe, struct pipe_region **region)
+{
+ assert((*region)->refcount > 0);
+ (*region)->refcount--;
+
+ if ((*region)->refcount == 0) {
+ assert((*region)->map_refcount == 0);
+
+#if 0
+ if ((*region)->pbo)
+ (*region)->pbo->region = NULL;
+ (*region)->pbo = NULL;
+#endif
+
+ free(*region);
+ }
+ *region = NULL;
+}
+
+
+
+static GLubyte *
+sp_region_map(struct pipe_context *pipe, struct pipe_region *region)
+{
+ region->map_refcount++;
+ return region->map;
+}
+
+
+static void
+sp_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
+{
+ region->map_refcount--;
+}
+
+
+void
+sp_init_region_functions(struct softpipe_context *sp)
+{
+ sp->pipe.region_alloc = sp_region_alloc;
+ sp->pipe.region_release = sp_region_release;
+
+ sp->pipe.region_map = sp_region_map;
+ sp->pipe.region_unmap = sp_region_unmap;
+
+ /* XXX lots of other region functions needed... */
+}
--- /dev/null
+/**************************************************************************
+ *
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+
+
+#ifndef SP_REGION_H
+#define SP_REGION_H
+
+
+struct softpipe_context;
+
+
+extern void
+sp_init_region_functions(struct softpipe_context *sp);
+
+
+#endif /* SP_REGION_H */
#include "sp_context.h"
#include "sp_state.h"
#include "sp_surface.h"
-#include "sp_headers.h"
+#include "pipe/p_defines.h"
+#include "main/imports.h"
+
+/**
+ * Softpipe surface functions.
+ * Basically, create surface of a particular type, then plug in default
+ * read/write_quad functions.
+ * Note that these quad funcs assume the buffer/region is in a linear
+ * layout with Y=0=bottom.
+ * If we had swizzled/AOS buffers the read/write functions could be
+ * simplified a lot....
+ */
+
+
+#if 000 /* OLD... should be recycled... */
static void rgba8_read_quad_f( struct softpipe_surface *gs,
GLint x, GLint y,
GLfloat (*rgba)[NUM_CHANNELS] )
}
}
-
-
-
static void rgba8_read_quad_ub( struct softpipe_surface *gs,
GLint x, GLint y,
GLubyte (*rgba)[NUM_CHANNELS] )
}
}
-
static void rgba8_write_quad_ub( struct softpipe_surface *gs,
GLint x, GLint y,
GLubyte (*rgba)[NUM_CHANNELS] )
}
}
+#endif
+
+
+
+static void
+z16_read_quad_z(struct softpipe_surface *sps,
+ GLint x, GLint y, GLuint zzzz[QUAD_SIZE])
+{
+ const GLushort *src
+ = (GLushort *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_Z16);
+
+ /* converting GLushort to GLuint: */
+ zzzz[0] = src[0];
+ zzzz[1] = src[1];
+ src += sps->surface.region->pitch;
+ zzzz[2] = src[0];
+ zzzz[3] = src[1];
+}
+
+static void
+z16_write_quad_z(struct softpipe_surface *sps,
+ GLint x, GLint y, const GLuint zzzz[QUAD_SIZE])
+{
+ GLushort *dst = (GLushort *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_Z16);
+
+ /* converting GLuint to GLushort: */
+ dst[0] = zzzz[0];
+ dst[1] = zzzz[1];
+ dst += sps->surface.region->pitch;
+ dst[0] = zzzz[2];
+ dst[1] = zzzz[3];
+}
+
+static void
+z32_read_quad_z(struct softpipe_surface *sps,
+ GLint x, GLint y, GLuint zzzz[QUAD_SIZE])
+{
+ const GLuint *src
+ = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_Z32);
+
+ zzzz[0] = src[0];
+ zzzz[1] = src[1];
+ src += sps->surface.region->pitch;
+ zzzz[2] = src[0];
+ zzzz[3] = src[1];
+}
+
+static void
+z32_write_quad_z(struct softpipe_surface *sps,
+ GLint x, GLint y, const GLuint zzzz[QUAD_SIZE])
+{
+ GLuint *dst = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_Z32);
+
+ dst[0] = zzzz[0];
+ dst[1] = zzzz[1];
+ dst += sps->surface.region->pitch;
+ dst[0] = zzzz[2];
+ dst[1] = zzzz[3];
+}
+
+static void
+z24s8_read_quad_z(struct softpipe_surface *sps,
+ GLint x, GLint y, GLuint zzzz[QUAD_SIZE])
+{
+ const GLuint *src
+ = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
+
+ zzzz[0] = src[0] >> 8;
+ zzzz[1] = src[1] >> 8;
+ src += sps->surface.region->pitch;
+ zzzz[2] = src[0] >> 8;
+ zzzz[3] = src[1] >> 8;
+}
+
+static void
+z24s8_write_quad_z(struct softpipe_surface *sps,
+ GLint x, GLint y, const GLuint zzzz[QUAD_SIZE])
+{
+ GLuint *dst = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
+ assert(zzzz[0] <= 0xffffff);
+
+ dst[0] = (dst[0] & 0xff) | (zzzz[0] << 8);
+ dst[1] = (dst[1] & 0xff) | (zzzz[1] << 8);
+ dst += sps->surface.region->pitch;
+ dst[0] = (dst[0] & 0xff) | (zzzz[2] << 8);
+ dst[1] = (dst[1] & 0xff) | (zzzz[3] << 8);
+}
+
+static void
+z24s8_read_quad_stencil(struct softpipe_surface *sps,
+ GLint x, GLint y, GLubyte ssss[QUAD_SIZE])
+{
+ const GLuint *src
+ = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
+
+ ssss[0] = src[0] & 0xff;
+ ssss[1] = src[1] & 0xff;
+ src += sps->surface.region->pitch;
+ ssss[2] = src[0] & 0xff;
+ ssss[3] = src[1] & 0xff;
+}
+static void
+z24s8_write_quad_stencil(struct softpipe_surface *sps,
+ GLint x, GLint y, const GLubyte ssss[QUAD_SIZE])
+{
+ GLuint *dst = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
+ dst[0] = (dst[0] & 0xffffff00) | ssss[0];
+ dst[1] = (dst[1] & 0xffffff00) | ssss[1];
+ dst += sps->surface.region->pitch;
+ dst[0] = (dst[0] & 0xffffff00) | ssss[2];
+ dst[1] = (dst[1] & 0xffffff00) | ssss[3];
+}
-struct softpipe_surface_type gs_rgba8 = {
- G_SURFACE_RGBA_8888,
- rgba8_read_quad_f,
- rgba8_read_quad_f_swz,
- rgba8_read_quad_ub,
- rgba8_write_quad_f,
- rgba8_write_quad_f_swz,
- rgba8_write_quad_ub,
-};
+static void
+s8_read_quad_stencil(struct softpipe_surface *sps,
+ GLint x, GLint y, GLubyte ssss[QUAD_SIZE])
+{
+ const GLubyte *src
+ = sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_S8);
+
+ ssss[0] = src[0];
+ ssss[1] = src[1];
+ src += sps->surface.region->pitch;
+ ssss[2] = src[0];
+ ssss[3] = src[1];
+}
+
+static void
+s8_write_quad_stencil(struct softpipe_surface *sps,
+ GLint x, GLint y, const GLubyte ssss[QUAD_SIZE])
+{
+ GLubyte *dst
+ = sps->surface.region->map + y * sps->surface.region->pitch + x;
+ assert(sps->surface.format == PIPE_FORMAT_U_S8);
+ dst[0] = ssss[0];
+ dst[1] = ssss[1];
+ dst += sps->surface.region->pitch;
+ dst[0] = ssss[2];
+ dst[1] = ssss[3];
+}
+
+
+
+static void
+init_quad_funcs(struct softpipe_surface *sps)
+{
+ switch (sps->surface.format) {
+ case PIPE_FORMAT_U_Z16:
+ sps->read_quad_z = z16_read_quad_z;
+ sps->write_quad_z = z16_write_quad_z;
+ break;
+ case PIPE_FORMAT_U_Z32:
+ sps->read_quad_z = z32_read_quad_z;
+ sps->write_quad_z = z32_write_quad_z;
+ break;
+ case PIPE_FORMAT_Z24_S8:
+ sps->read_quad_z = z24s8_read_quad_z;
+ sps->write_quad_z = z24s8_write_quad_z;
+ sps->read_quad_stencil = z24s8_read_quad_stencil;
+ sps->write_quad_stencil = z24s8_write_quad_stencil;
+ break;
+ case PIPE_FORMAT_U_S8:
+ sps->read_quad_stencil = s8_read_quad_stencil;
+ sps->write_quad_stencil = s8_write_quad_stencil;
+ break;
+ default:
+ assert(0);
+ }
+}
+
+
+static struct pipe_surface *
+sp_surface_alloc(struct pipe_context *pipe, GLenum format)
+{
+ struct softpipe_surface *sps = CALLOC_STRUCT(softpipe_surface);
+ if (!sps)
+ return NULL;
+
+ sps->surface.format = format;
+ init_quad_funcs(sps);
+
+ return &sps->surface;
+}
+
+
+void
+sp_init_surface_functions(struct softpipe_context *sp)
+{
+ sp->pipe.surface_alloc = sp_surface_alloc;
+}
#include "sp_headers.h"
struct softpipe_surface;
-
-#define G_SURFACE_RGBA_8888 0x1
+struct softpipe_context;
/**
}
+extern void
+sp_init_surface_functions(struct softpipe_context *sp);
+
+
#endif /* SP_SURFACE_H */
#include "sp_surface.h"
#include "sp_z_surface.h"
-static void*
-z_map(struct pipe_buffer *pb, GLuint access_mode)
-{
- struct softpipe_surface *sps = (struct softpipe_surface *) pb;
- sps->surface.ptr = pb->ptr;
- sps->surface.stride = sps->surface.width;
- return pb->ptr;
-}
-
-static void
-z_unmap(struct pipe_buffer *pb)
-{
- struct softpipe_surface *sps = (struct softpipe_surface *) pb;
- sps->surface.ptr = NULL;
- sps->surface.stride = 0;
-}
-
-static void
-z_resize(struct pipe_surface *ps, GLuint width, GLuint height)
-{
- struct softpipe_surface *sps = (struct softpipe_surface *) ps;
-
- if (sps->surface.buffer.ptr)
- free(sps->surface.buffer.ptr);
-
- sps->surface.stride = sps->surface.width;
- if (sps->surface.format == PIPE_FORMAT_U_Z16)
- sps->surface.cpp = 2;
- else if (sps->surface.format == PIPE_FORMAT_U_Z32 ||
- sps->surface.format == PIPE_FORMAT_Z24_S8)
- sps->surface.cpp = 4;
- else
- assert(0);
-
- ps->buffer.ptr = (GLubyte *) malloc(width * height * sps->surface.cpp);
- ps->width = width;
- ps->height = height;
-
-}
-
static void
z16_read_quad_z(struct softpipe_surface *sps,
GLint x, GLint y, GLuint zzzz[QUAD_SIZE])
{
const GLushort *src
- = (GLushort *) sps->surface.ptr + y * sps->surface.stride + x;
+ = (GLushort *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_U_Z16);
/* converting GLushort to GLuint: */
zzzz[0] = src[0];
zzzz[1] = src[1];
- zzzz[2] = src[sps->surface.width + 0];
- zzzz[3] = src[sps->surface.width + 1];
+ zzzz[2] = src[sps->surface.region->pitch + 0];
+ zzzz[3] = src[sps->surface.region->pitch + 1];
}
static void
z16_write_quad_z(struct softpipe_surface *sps,
GLint x, GLint y, const GLuint zzzz[QUAD_SIZE])
{
- GLushort *dst = (GLushort *) sps->surface.ptr + y * sps->surface.stride + x;
+ GLushort *dst = (GLushort *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_U_Z16);
/* converting GLuint to GLushort: */
dst[0] = zzzz[0];
dst[1] = zzzz[1];
- dst[sps->surface.width + 0] = zzzz[2];
- dst[sps->surface.width + 1] = zzzz[3];
+ dst[sps->surface.region->pitch + 0] = zzzz[2];
+ dst[sps->surface.region->pitch + 1] = zzzz[3];
}
static void
GLint x, GLint y, GLuint zzzz[QUAD_SIZE])
{
const GLuint *src
- = (GLuint *) sps->surface.ptr + y * sps->surface.stride + x;
+ = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_U_Z32);
zzzz[0] = src[0];
zzzz[1] = src[1];
- zzzz[2] = src[sps->surface.width + 0];
- zzzz[3] = src[sps->surface.width + 1];
+ zzzz[2] = src[sps->surface.region->pitch + 0];
+ zzzz[3] = src[sps->surface.region->pitch + 1];
}
static void
z32_write_quad_z(struct softpipe_surface *sps,
GLint x, GLint y, const GLuint zzzz[QUAD_SIZE])
{
- GLuint *dst = (GLuint *) sps->surface.ptr + y * sps->surface.stride + x;
+ GLuint *dst = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_U_Z32);
dst[0] = zzzz[0];
dst[1] = zzzz[1];
- dst[sps->surface.width + 0] = zzzz[2];
- dst[sps->surface.width + 1] = zzzz[3];
+ dst[sps->surface.region->pitch + 0] = zzzz[2];
+ dst[sps->surface.region->pitch + 1] = zzzz[3];
}
static void
GLint x, GLint y, GLuint zzzz[QUAD_SIZE])
{
const GLuint *src
- = (GLuint *) sps->surface.ptr + y * sps->surface.stride + x;
+ = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
zzzz[0] = src[0] >> 8;
zzzz[1] = src[1] >> 8;
- zzzz[2] = src[sps->surface.width + 0] >> 8;
- zzzz[3] = src[sps->surface.width + 1] >> 8;
+ zzzz[2] = src[sps->surface.region->pitch + 0] >> 8;
+ zzzz[3] = src[sps->surface.region->pitch + 1] >> 8;
}
static void
z24s8_write_quad_z(struct softpipe_surface *sps,
GLint x, GLint y, const GLuint zzzz[QUAD_SIZE])
{
- GLuint *dst = (GLuint *) sps->surface.ptr + y * sps->surface.stride + x;
+ GLuint *dst = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
assert(zzzz[0] <= 0xffffff);
dst[0] = (dst[0] & 0xff) | (zzzz[0] << 8);
dst[1] = (dst[1] & 0xff) | (zzzz[1] << 8);
- dst += sps->surface.width;
+ dst += sps->surface.region->pitch;
dst[0] = (dst[0] & 0xff) | (zzzz[2] << 8);
dst[1] = (dst[1] & 0xff) | (zzzz[3] << 8);
}
GLint x, GLint y, GLubyte ssss[QUAD_SIZE])
{
const GLuint *src
- = (GLuint *) sps->surface.ptr + y * sps->surface.stride + x;
+ = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
ssss[0] = src[0] & 0xff;
ssss[1] = src[1] & 0xff;
- ssss[2] = src[sps->surface.width + 0] & 0xff;
- ssss[3] = src[sps->surface.width + 1] & 0xff;
+ ssss[2] = src[sps->surface.region->pitch + 0] & 0xff;
+ ssss[3] = src[sps->surface.region->pitch + 1] & 0xff;
}
static void
z24s8_write_quad_stencil(struct softpipe_surface *sps,
GLint x, GLint y, const GLubyte ssss[QUAD_SIZE])
{
- GLuint *dst = (GLuint *) sps->surface.ptr + y * sps->surface.stride + x;
+ GLuint *dst = (GLuint *) sps->surface.region->map + y * sps->surface.region->pitch + x;
assert(sps->surface.format == PIPE_FORMAT_Z24_S8);
dst[0] = (dst[0] & 0xffffff00) | ssss[0];
dst[1] = (dst[1] & 0xffffff00) | ssss[1];
- dst += sps->surface.width;
+ dst += sps->surface.region->pitch;
dst[0] = (dst[0] & 0xffffff00) | ssss[2];
dst[1] = (dst[1] & 0xffffff00) | ssss[3];
}
+static void
+s8_read_quad_stencil(struct softpipe_surface *sps,
+ GLint x, GLint y, GLubyte ssss[QUAD_SIZE])
+{
+ const GLubyte *src
+ = sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_S8);
+
+ ssss[0] = src[0];
+ ssss[1] = src[1];
+ src += sps->surface.region->pitch;
+ ssss[2] = src[0];
+ ssss[3] = src[1];
+}
+
+static void
+s8_write_quad_stencil(struct softpipe_surface *sps,
+ GLint x, GLint y, const GLubyte ssss[QUAD_SIZE])
+{
+ GLubyte *dst
+ = sps->surface.region->map + y * sps->surface.region->pitch + x;
+
+ assert(sps->surface.format == PIPE_FORMAT_U_S8);
+
+ dst[0] = ssss[0];
+ dst[1] = ssss[1];
+ dst += sps->surface.region->pitch;
+ dst[0] = ssss[2];
+ dst[1] = ssss[3];
+}
+
+
/**
* Create a new software-based Z buffer.
return NULL;
sps->surface.format = format;
- sps->surface.resize = z_resize;
- sps->surface.buffer.map = z_map;
- sps->surface.buffer.unmap = z_unmap;
-
- if (format == PIPE_FORMAT_U_Z16) {
- sps->read_quad_z = z16_read_quad_z;
- sps->write_quad_z = z16_write_quad_z;
- }
- else if (format == PIPE_FORMAT_U_Z32) {
- sps->read_quad_z = z32_read_quad_z;
- sps->write_quad_z = z32_write_quad_z;
- }
- else if (format == PIPE_FORMAT_Z24_S8) {
- sps->read_quad_z = z24s8_read_quad_z;
- sps->write_quad_z = z24s8_write_quad_z;
- sps->read_quad_stencil = z24s8_read_quad_stencil;
- sps->write_quad_stencil = z24s8_write_quad_stencil;
- }
- else {
- assert(0);
- }
return sps;
}
SOFTPIPE_SOURCES = \
pipe/softpipe/sp_clear.c \
pipe/softpipe/sp_context.c \
+ pipe/softpipe/sp_region.c \
pipe/softpipe/sp_quad.c \
pipe/softpipe/sp_quad_alpha_test.c \
pipe/softpipe/sp_quad_blend.c \
pipe/softpipe/sp_state_sampler.c \
pipe/softpipe/sp_state_setup.c \
pipe/softpipe/sp_state_surface.c \
- pipe/softpipe/sp_z_surface.c \
+ pipe/softpipe/sp_surface.c \
pipe/softpipe/sp_prim_setup.c
DRAW_SOURCES = \