Hide texture layout details from the state tracker.
[mesa.git] / src / mesa / state_tracker / st_cb_bufferobjects.c
index a667b3e77535f6befae464da45f6193851bd2814..99e1eb3c7a64515ed0e810b6e0985d528ea87454 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  * 
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
  * All Rights Reserved.
  * 
  * Permission is hereby granted, free of charge, to any person obtaining a
  **************************************************************************/
 
 
-#include "imports.h"
-#include "mtypes.h"
-#include "bufferobj.h"
+#include "main/imports.h"
+#include "main/mtypes.h"
+#include "main/bufferobj.h"
 
 #include "st_context.h"
 #include "st_cb_bufferobjects.h"
 
 #include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
+
+
 
 /* Pixel buffers and Vertex/index buffers are handled through these
  * mesa callbacks.  Framebuffer/Renderbuffer objects are
@@ -54,9 +58,12 @@ st_bufferobj_alloc(GLcontext *ctx, GLuint name, GLenum target)
    struct st_context *st = st_context(ctx);
    struct st_buffer_object *st_obj = CALLOC_STRUCT(st_buffer_object);
 
+   if (!st_obj)
+      return NULL;
+
    _mesa_initialize_buffer_object(&st_obj->Base, name, target);
 
-   st_obj->buffer = st->pipe->create_buffer( st->pipe, 32, 0 );
+   st_obj->buffer = st->pipe->winsys->buffer_create( st->pipe->winsys, 32 );
 
    return &st_obj->Base;
 }
@@ -74,9 +81,9 @@ st_bufferobj_free(GLcontext *ctx, struct gl_buffer_object *obj)
    struct st_buffer_object *st_obj = st_buffer_object(obj);
 
    if (st_obj->buffer) 
-      pipe->buffer_unreference(pipe, &st_obj->buffer);
+      pipe->winsys->buffer_reference(pipe->winsys, &st_obj->buffer, NULL);
 
-   FREE(st_obj);
+   free(st_obj);
 }
 
 
@@ -97,11 +104,29 @@ st_bufferobj_data(GLcontext *ctx,
 {
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
+   unsigned buffer_usage;
 
    st_obj->Base.Size = size;
    st_obj->Base.Usage = usage;
+   
+   switch(target) {
+   case GL_PIXEL_PACK_BUFFER_ARB:
+   case GL_PIXEL_UNPACK_BUFFER_ARB:
+      buffer_usage = PIPE_BUFFER_USAGE_PIXEL;
+      break;
+   case GL_ARRAY_BUFFER_ARB:
+      buffer_usage = PIPE_BUFFER_USAGE_VERTEX;
+      break;
+   case GL_ELEMENT_ARRAY_BUFFER_ARB:
+      buffer_usage = PIPE_BUFFER_USAGE_INDEX;
+      break;
+   default:
+      buffer_usage = 0;
+   }
 
-   pipe->buffer_data( pipe, st_obj->buffer, size, data );
+   pipe->winsys->buffer_data( pipe->winsys, st_obj->buffer, 
+                              size, data, 
+                              buffer_usage );
 }
 
 
@@ -121,7 +146,7 @@ st_bufferobj_subdata(GLcontext *ctx,
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
 
-   pipe->buffer_subdata(pipe, st_obj->buffer, offset, size, data);
+   pipe->winsys->buffer_subdata(pipe->winsys, st_obj->buffer, offset, size, data);
 }
 
 
@@ -130,26 +155,24 @@ st_bufferobj_subdata(GLcontext *ctx,
  */
 static void
 st_bufferobj_get_subdata(GLcontext *ctx,
-                            GLenum target,
-                            GLintptrARB offset,
-                            GLsizeiptrARB size,
-                            GLvoid * data, struct gl_buffer_object *obj)
+                         GLenum target,
+                         GLintptrARB offset,
+                         GLsizeiptrARB size,
+                         GLvoid * data, struct gl_buffer_object *obj)
 {
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
 
-   pipe->buffer_get_subdata(pipe, st_obj->buffer, offset, size, data);
+   pipe->winsys->buffer_get_subdata(pipe->winsys, st_obj->buffer, offset, size, data);
 }
 
 
-
 /**
  * Called via glMapBufferARB().
  */
 static void *
-st_bufferobj_map(GLcontext *ctx,
-                    GLenum target,
-                    GLenum access, struct gl_buffer_object *obj)
+st_bufferobj_map(GLcontext *ctx, GLenum target, GLenum access,
+                 struct gl_buffer_object *obj)
 {
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
@@ -159,18 +182,17 @@ st_bufferobj_map(GLcontext *ctx,
    case GL_WRITE_ONLY:
       flags = PIPE_BUFFER_FLAG_WRITE;
       break;
-
-
+   case GL_READ_ONLY:
       flags = PIPE_BUFFER_FLAG_READ;
       break;
-
    case GL_READ_WRITE:
+      /* fall-through */
    default:
       flags = PIPE_BUFFER_FLAG_READ | PIPE_BUFFER_FLAG_WRITE;
       break;      
    }
 
-   obj->Pointer = pipe->buffer_map(pipe, st_obj->buffer, flags);
+   obj->Pointer = pipe->winsys->buffer_map(pipe->winsys, st_obj->buffer, flags);
    return obj->Pointer;
 }
 
@@ -179,28 +201,25 @@ st_bufferobj_map(GLcontext *ctx,
  * Called via glMapBufferARB().
  */
 static GLboolean
-st_bufferobj_unmap(GLcontext *ctx,
-                  GLenum target, struct gl_buffer_object *obj)
+st_bufferobj_unmap(GLcontext *ctx, GLenum target, struct gl_buffer_object *obj)
 {
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
 
-   pipe->buffer_unmap(pipe, st_obj->buffer);
+   pipe->winsys->buffer_unmap(pipe->winsys, st_obj->buffer);
    obj->Pointer = NULL;
    return GL_TRUE;
 }
 
 
 void
-st_init_cb_bufferobjects( struct st_context *st )
+st_init_bufferobject_functions(struct dd_function_table *functions)
 {
-   GLcontext *ctx = st->ctx;
-
-   ctx->Driver.NewBufferObject = st_bufferobj_alloc;
-   ctx->Driver.DeleteBuffer = st_bufferobj_free;
-   ctx->Driver.BufferData = st_bufferobj_data;
-   ctx->Driver.BufferSubData = st_bufferobj_subdata;
-   ctx->Driver.GetBufferSubData = st_bufferobj_get_subdata;
-   ctx->Driver.MapBuffer = st_bufferobj_map;
-   ctx->Driver.UnmapBuffer = st_bufferobj_unmap;
+   functions->NewBufferObject = st_bufferobj_alloc;
+   functions->DeleteBuffer = st_bufferobj_free;
+   functions->BufferData = st_bufferobj_data;
+   functions->BufferSubData = st_bufferobj_subdata;
+   functions->GetBufferSubData = st_bufferobj_get_subdata;
+   functions->MapBuffer = st_bufferobj_map;
+   functions->UnmapBuffer = st_bufferobj_unmap;
 }