From ff99103c0a8a1b9e76fff80f9753d2124da27da2 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Wed, 1 Jun 2011 11:31:56 -0700 Subject: intel: Define span functions for S8 renderbuffers Since the stencil buffer is interleaved, the generic Mesa renderbuffer accessors do not suffice. Custom span functions are necessary. Acked-by: Kenneth Graunke Reviewed-by: Eric Anholt Signed-off-by: Chad Versace --- src/mesa/drivers/dri/intel/intel_span.c | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 5290342c3e1..a4a1d6bd6eb 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -1,6 +1,7 @@ /************************************************************************** * * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2011 Intel Corporation * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -23,9 +24,13 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * Authors: + * Chad Versace + * **************************************************************************/ #include +#include #include "main/glheader.h" #include "main/macros.h" #include "main/mtypes.h" @@ -112,6 +117,64 @@ intel_set_span_functions(struct intel_context *intel, #define TAG2(x,y) intel_##x##y##_A8 #include "spantmp2.h" +/* ------------------------------------------------------------------------- */ +/* s8 stencil span and pixel functions */ +/* ------------------------------------------------------------------------- */ + +/* + * HAVE_HW_STENCIL_SPANS determines if stencil buffer read/writes are done with + * memcpy or for loops. Since the stencil buffer is interleaved, memcpy won't + * work. + */ +#define HAVE_HW_STENCIL_SPANS 0 + +#define LOCAL_STENCIL_VARS \ + (void) ctx; \ + int minx = 0; \ + int miny = 0; \ + int maxx = rb->Width; \ + int maxy = rb->Height; \ + int stride = rb->RowStride; \ + uint8_t *buf = rb->Data; \ + +/* Don't flip y. */ +#undef Y_FLIP +#define Y_FLIP(y) y + +/** + * \brief Get pointer offset into stencil buffer. + * + * The stencil buffer interleaves two rows into one. Yay for crazy hardware. + * The table below demonstrates how the pointer arithmetic behaves for a buffer + * with positive stride (s=stride). + * + * x | y | byte offset + * -------------------------- + * 0 | 0 | 0 + * 0 | 0 | 1 + * 1 | 0 | 2 + * 1 | 1 | 3 + * ... | ... | ... + * 0 | 2 | s + * 0 | 3 | s + 1 + * 1 | 2 | s + 2 + * 1 | 3 | s + 3 + * + * + */ +static inline intptr_t +intel_offset_S8(int stride, GLint x, GLint y) +{ + return 2 * ((y / 2) * stride + x) + y % 2; +} + +#define WRITE_STENCIL(x, y, src) buf[intel_offset_S8(stride, x, y)] = src; +#define READ_STENCIL(dest, x, y) dest = buf[intel_offset_S8(stride, x, y)] +#define TAG(x) intel_##x##_S8 +#include "stenciltmp.h" + +/* ------------------------------------------------------------------------- */ + void intel_renderbuffer_map(struct intel_context *intel, struct gl_renderbuffer *rb) { @@ -332,6 +395,7 @@ static span_init_func intel_span_init_funcs[MESA_FORMAT_COUNT] = [MESA_FORMAT_Z16] = _mesa_set_renderbuffer_accessors, [MESA_FORMAT_X8_Z24] = _mesa_set_renderbuffer_accessors, [MESA_FORMAT_S8_Z24] = _mesa_set_renderbuffer_accessors, + [MESA_FORMAT_S8] = intel_InitStencilPointers_S8, [MESA_FORMAT_R8] = _mesa_set_renderbuffer_accessors, [MESA_FORMAT_RG88] = _mesa_set_renderbuffer_accessors, [MESA_FORMAT_R16] = _mesa_set_renderbuffer_accessors, -- cgit v1.2.3