/**************************************************************************
*
- * 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
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;
}
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);
}
{
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 );
}
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);
}
*/
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);
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;
}
* 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;
}