a bunch of assorted fixes

This commit is contained in:
Brian Paul
2005-02-08 03:46:37 +00:00
parent 386e997f45
commit 1864c7d79a
2 changed files with 85 additions and 81 deletions

View File

@@ -36,6 +36,10 @@
#include "texstore.h" #include "texstore.h"
static struct gl_frame_buffer_object DummyFramebuffer;
static struct gl_render_buffer_object DummyRenderbuffer;
#define IS_CUBE_FACE(TARGET) \ #define IS_CUBE_FACE(TARGET) \
((TARGET) >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && \ ((TARGET) >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && \
(TARGET) <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) (TARGET) <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
@@ -49,7 +53,7 @@ lookup_renderbuffer(GLcontext *ctx, GLuint id)
{ {
struct gl_render_buffer_object *rb; struct gl_render_buffer_object *rb;
if (!id == 0) if (id == 0)
return NULL; return NULL;
rb = (struct gl_render_buffer_object *) rb = (struct gl_render_buffer_object *)
@@ -66,7 +70,7 @@ lookup_framebuffer(GLcontext *ctx, GLuint id)
{ {
struct gl_frame_buffer_object *fb; struct gl_frame_buffer_object *fb;
if (!id == 0) if (id == 0)
return NULL; return NULL;
fb = (struct gl_frame_buffer_object *) fb = (struct gl_frame_buffer_object *)
@@ -203,7 +207,7 @@ set_renderbuffer_attachment(GLcontext *ctx,
} }
GLboolean GLboolean GLAPIENTRY
_mesa_IsRenderbufferEXT(GLuint renderbuffer) _mesa_IsRenderbufferEXT(GLuint renderbuffer)
{ {
struct gl_render_buffer_object *rb; struct gl_render_buffer_object *rb;
@@ -216,7 +220,7 @@ _mesa_IsRenderbufferEXT(GLuint renderbuffer)
} }
void void GLAPIENTRY
_mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer) _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
{ {
struct gl_render_buffer_object *newRb, *oldRb; struct gl_render_buffer_object *newRb, *oldRb;
@@ -232,6 +236,10 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
if (renderbuffer) { if (renderbuffer) {
newRb = lookup_renderbuffer(ctx, renderbuffer); newRb = lookup_renderbuffer(ctx, renderbuffer);
if (newRb == &DummyRenderbuffer) {
/* ID was reserved, but no real renderbuffer object made yet */
newRb = NULL;
}
if (!newRb) { if (!newRb) {
/* create new renderbuffer object */ /* create new renderbuffer object */
newRb = new_renderbuffer(ctx, renderbuffer); newRb = new_renderbuffer(ctx, renderbuffer);
@@ -239,6 +247,7 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindRenderbufferEXT"); _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindRenderbufferEXT");
return; return;
} }
_mesa_HashInsert(ctx->Shared->RenderBuffers, renderbuffer, newRb);
} }
newRb->RefCount++; newRb->RefCount++;
} }
@@ -254,11 +263,13 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
} }
} }
ASSERT(newRb != &DummyRenderbuffer);
ctx->CurrentRenderbuffer = newRb; ctx->CurrentRenderbuffer = newRb;
} }
void void GLAPIENTRY
_mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers) _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
{ {
GLint i; GLint i;
@@ -274,12 +285,14 @@ _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
/* remove from hash table immediately, to free the ID */ /* remove from hash table immediately, to free the ID */
_mesa_HashRemove(ctx->Shared->RenderBuffers, renderbuffers[i]); _mesa_HashRemove(ctx->Shared->RenderBuffers, renderbuffers[i]);
/* But the object will not be freed until it's no longer bound in if (rb != &DummyRenderbuffer) {
* any context. /* But the object will not be freed until it's no longer
*/ * bound in any context.
rb->RefCount--; */
if (rb->RefCount == 0) { rb->RefCount--;
_mesa_free(rb); /* XXX call device driver function */ if (rb->RefCount == 0) {
_mesa_free(rb); /* XXX call device driver function */
}
} }
} }
} }
@@ -287,7 +300,7 @@ _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
} }
void void GLAPIENTRY
_mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers) _mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers)
{ {
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
@@ -307,17 +320,11 @@ _mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers)
first = _mesa_HashFindFreeKeyBlock(ctx->Shared->RenderBuffers, n); first = _mesa_HashFindFreeKeyBlock(ctx->Shared->RenderBuffers, n);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
struct gl_render_buffer_object *rb;
GLuint name = first + i; GLuint name = first + i;
rb = new_renderbuffer(ctx, name);
if (!rb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenRenderbuffersEXT");
return;
}
/* insert into hash table */ /* insert dummy placeholder into hash table */
_glthread_LOCK_MUTEX(ctx->Shared->Mutex); _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
_mesa_HashInsert(ctx->Shared->RenderBuffers, name, rb); _mesa_HashInsert(ctx->Shared->RenderBuffers, name, &DummyRenderbuffer);
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
renderbuffers[i] = name; renderbuffers[i] = name;
@@ -398,7 +405,7 @@ base_internal_format(GLcontext *ctx, GLenum internalFormat)
} }
void void GLAPIENTRY
_mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat, _mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat,
GLsizei width, GLsizei height) GLsizei width, GLsizei height)
{ {
@@ -452,7 +459,7 @@ _mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat,
} }
void void GLAPIENTRY
_mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params) _mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params)
{ {
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
@@ -489,7 +496,7 @@ _mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params)
} }
GLboolean GLboolean GLAPIENTRY
_mesa_IsFramebufferEXT(GLuint framebuffer) _mesa_IsFramebufferEXT(GLuint framebuffer)
{ {
struct gl_frame_buffer_object *fb; struct gl_frame_buffer_object *fb;
@@ -502,7 +509,7 @@ _mesa_IsFramebufferEXT(GLuint framebuffer)
} }
void void GLAPIENTRY
_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer) _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
{ {
struct gl_frame_buffer_object *newFb, *oldFb; struct gl_frame_buffer_object *newFb, *oldFb;
@@ -518,6 +525,9 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
if (framebuffer) { if (framebuffer) {
newFb = lookup_framebuffer(ctx, framebuffer); newFb = lookup_framebuffer(ctx, framebuffer);
if (newFb == &DummyFramebuffer) {
newFb = NULL;
}
if (!newFb) { if (!newFb) {
/* create new framebuffer object */ /* create new framebuffer object */
newFb = new_framebuffer(ctx, framebuffer); newFb = new_framebuffer(ctx, framebuffer);
@@ -525,6 +535,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindFramebufferEXT"); _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindFramebufferEXT");
return; return;
} }
_mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb);
} }
newFb->RefCount++; newFb->RefCount++;
} }
@@ -540,11 +551,13 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
} }
} }
ASSERT(newFb != &DummyFramebuffer);
ctx->CurrentFramebuffer = newFb; ctx->CurrentFramebuffer = newFb;
} }
void void GLAPIENTRY
_mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers) _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
{ {
GLint i; GLint i;
@@ -560,12 +573,14 @@ _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
/* remove from hash table immediately, to free the ID */ /* remove from hash table immediately, to free the ID */
_mesa_HashRemove(ctx->Shared->FrameBuffers, framebuffers[i]); _mesa_HashRemove(ctx->Shared->FrameBuffers, framebuffers[i]);
/* But the object will not be freed until it's no longer bound in if (fb != &DummyFramebuffer) {
* any context. /* But the object will not be freed until it's no longer
*/ * bound in any context.
fb->RefCount--; */
if (fb->RefCount == 0) { fb->RefCount--;
_mesa_free(fb); /* XXX call device driver function */ if (fb->RefCount == 0) {
_mesa_free(fb); /* XXX call device driver function */
}
} }
} }
} }
@@ -573,7 +588,7 @@ _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
} }
void void GLAPIENTRY
_mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers) _mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
{ {
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
@@ -593,17 +608,11 @@ _mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
first = _mesa_HashFindFreeKeyBlock(ctx->Shared->FrameBuffers, n); first = _mesa_HashFindFreeKeyBlock(ctx->Shared->FrameBuffers, n);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
struct gl_frame_buffer_object *fb;
GLuint name = first + i; GLuint name = first + i;
fb = new_framebuffer(ctx, name);
if (!fb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenFramebuffersEXT");
return;
}
/* insert into hash table */ /* insert into hash table */
_glthread_LOCK_MUTEX(ctx->Shared->Mutex); _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
_mesa_HashInsert(ctx->Shared->FrameBuffers, name, fb); _mesa_HashInsert(ctx->Shared->FrameBuffers, name, &DummyFramebuffer);
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
framebuffers[i] = name; framebuffers[i] = name;
@@ -612,7 +621,7 @@ _mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
GLenum GLenum GLAPIENTRY
_mesa_CheckFramebufferStatusEXT(GLenum target) _mesa_CheckFramebufferStatusEXT(GLenum target)
{ {
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
@@ -688,7 +697,7 @@ error_check_framebuffer_texture(GLcontext *ctx, GLuint dims,
} }
void void GLAPIENTRY
_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment, _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level) GLenum textarget, GLuint texture, GLint level)
{ {
@@ -733,7 +742,7 @@ _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
} }
void void GLAPIENTRY
_mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment, _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level) GLenum textarget, GLuint texture, GLint level)
{ {
@@ -783,7 +792,7 @@ _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
} }
void void GLAPIENTRY
_mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment, _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLenum textarget, GLuint texture,
GLint level, GLint zoffset) GLint level, GLint zoffset)
@@ -832,13 +841,11 @@ _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
} }
void GLAPIENTRY
void
_mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment, _mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
GLenum renderbufferTarget, GLenum renderbufferTarget,
GLuint renderbuffer) GLuint renderbuffer)
{ {
struct gl_render_buffer_object *rb;
struct gl_render_buffer_attachment *att; struct gl_render_buffer_attachment *att;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
@@ -861,18 +868,6 @@ _mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
return; return;
} }
if (renderbuffer) {
rb = lookup_renderbuffer(ctx, renderbuffer);
if (!rb) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glFramebufferRenderbufferEXT(renderbuffer)");
return;
}
}
else {
rb = NULL; /* default renderbuffer */
}
att = get_attachment(ctx, attachment); att = get_attachment(ctx, attachment);
if (att == NULL) { if (att == NULL) {
_mesa_error(ctx, GL_INVALID_ENUM, _mesa_error(ctx, GL_INVALID_ENUM,
@@ -880,13 +875,23 @@ _mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
return; return;
} }
remove_attachment(ctx, att); if (renderbuffer) {
set_renderbuffer_attachment(ctx, att, rb); struct gl_render_buffer_object *rb;
rb = lookup_renderbuffer(ctx, renderbuffer);
if (!rb) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glFramebufferRenderbufferEXT(renderbuffer)");
return;
}
set_renderbuffer_attachment(ctx, att, rb);
}
else {
remove_attachment(ctx, att);
}
} }
void GLAPIENTRY
void
_mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, _mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
GLenum pname, GLint *params) GLenum pname, GLint *params)
{ {
@@ -965,8 +970,7 @@ _mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
} }
void GLAPIENTRY
void
_mesa_GenerateMipmapEXT(GLenum target) _mesa_GenerateMipmapEXT(GLenum target)
{ {
struct gl_texture_unit *texUnit; struct gl_texture_unit *texUnit;

View File

@@ -61,63 +61,63 @@ struct gl_frame_buffer_object
}; };
extern GLboolean extern GLboolean GLAPIENTRY
_mesa_IsRenderbufferEXT(GLuint renderbuffer); _mesa_IsRenderbufferEXT(GLuint renderbuffer);
extern void extern void GLAPIENTRY
_mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer); _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer);
extern void extern void GLAPIENTRY
_mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers); _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers);
extern void extern void GLAPIENTRY
_mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers); _mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers);
extern void extern void GLAPIENTRY
_mesa_RenderbufferStorageEXT(GLenum target, GLenum internalformat, _mesa_RenderbufferStorageEXT(GLenum target, GLenum internalformat,
GLsizei width, GLsizei height); GLsizei width, GLsizei height);
extern void extern void GLAPIENTRY
_mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params); _mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params);
extern GLboolean extern GLboolean GLAPIENTRY
_mesa_IsFramebufferEXT(GLuint framebuffer); _mesa_IsFramebufferEXT(GLuint framebuffer);
extern void extern void GLAPIENTRY
_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer); _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer);
extern void extern void GLAPIENTRY
_mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers); _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers);
extern void extern void GLAPIENTRY
_mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers); _mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers);
extern GLenum extern GLenum GLAPIENTRY
_mesa_CheckFramebufferStatusEXT(GLenum target); _mesa_CheckFramebufferStatusEXT(GLenum target);
extern void extern void GLAPIENTRY
_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment, _mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level); GLenum textarget, GLuint texture, GLint level);
extern void extern void GLAPIENTRY
_mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment, _mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level); GLenum textarget, GLuint texture, GLint level);
extern void extern void GLAPIENTRY
_mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment, _mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLenum textarget, GLuint texture,
GLint level, GLint zoffset); GLint level, GLint zoffset);
extern void extern void GLAPIENTRY
_mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment, _mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
GLenum renderbuffertarget, GLenum renderbuffertarget,
GLuint renderbuffer); GLuint renderbuffer);
extern void extern void GLAPIENTRY
_mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, _mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
GLenum pname, GLint *params); GLenum pname, GLint *params);
extern void extern void GLAPIENTRY
_mesa_GenerateMipmapEXT(GLenum target); _mesa_GenerateMipmapEXT(GLenum target);