diff options
| author | Brian <brian@i915.localnet.net> | 2007-07-30 13:11:52 -0600 | 
|---|---|---|
| committer | Brian <brian@i915.localnet.net> | 2007-07-30 13:11:52 -0600 | 
| commit | 3a35ce336458352653329426c550bfce1ffc3f66 (patch) | |
| tree | d57001db819b2abb97c5088bccef00784b94df76 | |
| parent | f1569bf0d5fcfd4430e13d6d1bd9c60fb44e9535 (diff) | |
implement surfaces for softpipe rendering
| -rw-r--r-- | src/mesa/drivers/dri/i915tex/Makefile | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i915tex/intel_fbo.h | 18 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i915tex/intel_surface.c | 163 | 
3 files changed, 182 insertions, 0 deletions
| diff --git a/src/mesa/drivers/dri/i915tex/Makefile b/src/mesa/drivers/dri/i915tex/Makefile index b218929dce..827acc0c46 100644 --- a/src/mesa/drivers/dri/i915tex/Makefile +++ b/src/mesa/drivers/dri/i915tex/Makefile @@ -48,6 +48,7 @@ DRIVER_SOURCES = \  	intel_screen.c \  	intel_span.c \  	intel_state.c \ +	intel_surface.c \  	intel_tris.c \  	intel_fbo.c \  	intel_depthstencil.c \ diff --git a/src/mesa/drivers/dri/i915tex/intel_fbo.h b/src/mesa/drivers/dri/i915tex/intel_fbo.h index 963f5e706f..1642ce774f 100644 --- a/src/mesa/drivers/dri/i915tex/intel_fbo.h +++ b/src/mesa/drivers/dri/i915tex/intel_fbo.h @@ -29,9 +29,25 @@  #define INTEL_FBO_H +#include "pipe/p_state.h" +#include "pipe/softpipe/sp_surface.h" + +  struct intel_context;  struct intel_region; + +/** + * Intel "pipe" surface.  This is kind of a temporary thing as + * renderbuffers and surfaces should eventually become one. + */ +struct intel_surface +{ +   struct softpipe_surface surface;  /**< base class */ +   struct intel_renderbuffer *rb;    /**< ptr back to matching renderbuffer */ +}; + +  /**   * Intel framebuffer, derived from gl_framebuffer.   */ @@ -82,6 +98,8 @@ struct intel_renderbuffer     GLuint pf_pending;  /**< sequence number of pending flip */     GLuint vbl_pending;   /**< vblank sequence number of pending flip */ + +   struct intel_surface *surface;  }; diff --git a/src/mesa/drivers/dri/i915tex/intel_surface.c b/src/mesa/drivers/dri/i915tex/intel_surface.c new file mode 100644 index 0000000000..29b640e58e --- /dev/null +++ b/src/mesa/drivers/dri/i915tex/intel_surface.c @@ -0,0 +1,163 @@ +#include "glheader.h" +#include "context.h" +#include "framebuffer.h" +#include "renderbuffer.h" +#include "utils.h" +#include "main/macros.h" + + +#include "intel_screen.h" + +#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_defines.h" +#include "pipe/softpipe/sp_surface.h" + + +/* + * XXX a lof of this is a temporary kludge + */ + +extern void +intel_map_unmap_buffers(struct intel_context *intel, GLboolean map); + + + +static void +read_quad_f_swz(struct softpipe_surface *gs, GLint x, GLint y, +                GLfloat (*rrrr)[QUAD_SIZE]) +{ + + +} + + +static void +write_quad_f_swz(struct softpipe_surface *sps, GLint x, GLint y, +                 GLfloat (*rrrr)[QUAD_SIZE]) +{ +   struct intel_surface *is = (struct intel_surface *) sps; +   struct intel_renderbuffer *irb = is->rb; +   const GLfloat *src = (const GLfloat *) rrrr; +   GLubyte *dst = (GLubyte *) irb->region->map +      + (y * irb->region->pitch + x) * irb->region->cpp; +   GLubyte temp[16]; +   GLuint i, j; + +   for (i = 0; i < 4; i++) { +      for (j = 0; j < 4; j++) { +         UNCLAMPED_FLOAT_TO_UBYTE(temp[j * 4 + i], src[i * 4 + j]); +      } +   } + +   printf("intel_surface::write_quad\n"); + +   memcpy(dst, temp, 8); +   memcpy(dst + irb->region->pitch * irb->region->cpp, temp + 8, 8); +} + + + +static void * +map_surface_buffer(struct pipe_buffer *pb, GLuint access_mode) +{ +   struct intel_surface *is = (struct intel_surface *) pb; +   struct intel_renderbuffer *irb = is->rb; +   GET_CURRENT_CONTEXT(ctx); +   struct intel_context *intel = intel_context(ctx); + +   assert(access_mode == PIPE_MAP_READ_WRITE); + +   intelFinish(&intel->ctx); + +   /*LOCK_HARDWARE(intel);*/ + +   if (irb->region) { +      intel_region_map(intel->intelScreen, irb->region); +   } +   pb->ptr = irb->region->map; + +   return pb->ptr; +} + + +static void +unmap_surface_buffer(struct pipe_buffer *pb) +{ +   struct intel_surface *is = (struct intel_surface *) pb; +   struct intel_renderbuffer *irb = is->rb; +   GET_CURRENT_CONTEXT(ctx); +   struct intel_context *intel = intel_context(ctx); + +   if (irb->region) { +      intel_region_unmap(intel->intelScreen, irb->region); +   } +   pb->ptr = NULL; + +   /*UNLOCK_HARDWARE(intel);*/ +} + + +struct pipe_surface * +xmesa_get_color_surface(GLcontext *ctx, GLuint i) +{ +   struct intel_context *intel = intel_context(ctx); +   struct intel_framebuffer *intel_fb; +   struct intel_renderbuffer *intel_rb; + +   intel_fb = (struct intel_framebuffer *) ctx->DrawBuffer; +   intel_rb = intel_fb->color_rb[1]; + +   if (!intel_rb->surface) { +      /* create surface and attach to intel_rb */ +      struct intel_surface *is; +      is = CALLOC_STRUCT(intel_surface); +      if (is) { +         is->surface.surface.width = intel_rb->Base.Width; +         is->surface.surface.height = intel_rb->Base.Height; + +         is->surface.read_quad_f_swz = read_quad_f_swz; +         is->surface.write_quad_f_swz = write_quad_f_swz; + +         is->surface.surface.buffer.map = map_surface_buffer; +         is->surface.surface.buffer.unmap = unmap_surface_buffer; + +         is->rb = intel_rb; +      } +      intel_rb->surface = is; +   } +   else { +      /* update surface size */ +      struct intel_surface *is = intel_rb->surface; +      is->surface.surface.width = intel_rb->Base.Width; +      is->surface.surface.height = intel_rb->Base.Height; +      /* sanity check */ +      assert(is->surface.surface.buffer.map == map_surface_buffer); +   } + +   return &intel_rb->surface->surface.surface; +} + + +struct pipe_surface * +xmesa_get_z_surface(GLcontext *ctx) +{ +   /* XXX fix */ +   return NULL; +} + + +struct pipe_surface * +xmesa_get_stencil_surface(GLcontext *ctx) +{ +   /* XXX fix */ +   return NULL; +} + + + | 
