mesa: fix-up and use _mesa_delete_renderbuffer()
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_fbo.c
index f0caf4c629199b9d007a65884adfca3962161964..3be958bbca7a2d9e4165b2df08875ffa6178ad47 100644 (file)
@@ -32,6 +32,7 @@
 #include "main/framebuffer.h"
 #include "main/renderbuffer.h"
 #include "main/fbobject.h"
+#include "main/mfeatures.h"
 
 static GLboolean
 set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat)
@@ -45,26 +46,22 @@ set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat)
        case GL_RGB8:
                rb->_BaseFormat  = GL_RGB;
                rb->Format = MESA_FORMAT_XRGB8888;
-               rb->DataType = GL_UNSIGNED_BYTE;
                s->cpp = 4;
                break;
        case GL_RGBA:
        case GL_RGBA8:
                rb->_BaseFormat  = GL_RGBA;
                rb->Format = MESA_FORMAT_ARGB8888;
-               rb->DataType = GL_UNSIGNED_BYTE;
                s->cpp = 4;
                break;
        case GL_RGB5:
                rb->_BaseFormat  = GL_RGB;
                rb->Format = MESA_FORMAT_RGB565;
-               rb->DataType = GL_UNSIGNED_BYTE;
                s->cpp = 2;
                break;
        case GL_DEPTH_COMPONENT16:
                rb->_BaseFormat  = GL_DEPTH_COMPONENT;
                rb->Format = MESA_FORMAT_Z16;
-               rb->DataType = GL_UNSIGNED_SHORT;
                s->cpp = 2;
                break;
        case GL_DEPTH_COMPONENT:
@@ -73,7 +70,6 @@ set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat)
        case GL_DEPTH24_STENCIL8_EXT:
                rb->_BaseFormat  = GL_DEPTH_STENCIL;
                rb->Format = MESA_FORMAT_Z24_S8;
-               rb->DataType = GL_UNSIGNED_INT_24_8_EXT;
                s->cpp = 4;
                break;
        default:
@@ -86,7 +82,7 @@ set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat)
 }
 
 static GLboolean
-nouveau_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
+nouveau_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
                             GLenum internalFormat,
                             GLuint width, GLuint height)
 {
@@ -111,11 +107,11 @@ nouveau_renderbuffer_del(struct gl_renderbuffer *rb)
        struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;
 
        nouveau_surface_ref(NULL, s);
-       FREE(rb);
+       _mesa_delete_renderbuffer(rb);
 }
 
 static struct gl_renderbuffer *
-nouveau_renderbuffer_new(GLcontext *ctx, GLuint name)
+nouveau_renderbuffer_new(struct gl_context *ctx, GLuint name)
 {
        struct gl_renderbuffer *rb;
 
@@ -132,8 +128,49 @@ nouveau_renderbuffer_new(GLcontext *ctx, GLuint name)
        return rb;
 }
 
+static void
+nouveau_renderbuffer_map(struct gl_context *ctx,
+                        struct gl_renderbuffer *rb,
+                        GLuint x, GLuint y, GLuint w, GLuint h,
+                        GLbitfield mode,
+                        GLubyte **out_map,
+                        GLint *out_stride)
+{
+       struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;
+       GLubyte *map;
+       int stride;
+       int flags = 0;
+
+       if (mode & GL_MAP_READ_BIT)
+               flags |= NOUVEAU_BO_RD;
+       if (mode & GL_MAP_WRITE_BIT)
+               flags |= NOUVEAU_BO_WR;
+
+       nouveau_bo_map(s->bo, flags, context_client(ctx));
+
+       map = s->bo->map;
+       stride = s->pitch;
+
+       if (rb->Name == 0) {
+               map += stride * (rb->Height - 1);
+               stride = -stride;
+       }
+
+       map += x * s->cpp;
+       map += (int)y * stride;
+
+       *out_map = map;
+       *out_stride = stride;
+}
+
+static void
+nouveau_renderbuffer_unmap(struct gl_context *ctx,
+                          struct gl_renderbuffer *rb)
+{
+}
+
 static GLboolean
-nouveau_renderbuffer_dri_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
+nouveau_renderbuffer_dri_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
                                 GLenum internalFormat,
                                 GLuint width, GLuint height)
 {
@@ -166,7 +203,7 @@ nouveau_renderbuffer_dri_new(GLenum format, __DRIdrawable *drawable)
 }
 
 static struct gl_framebuffer *
-nouveau_framebuffer_new(GLcontext *ctx, GLuint name)
+nouveau_framebuffer_new(struct gl_context *ctx, GLuint name)
 {
        struct nouveau_framebuffer *nfb;
 
@@ -180,7 +217,7 @@ nouveau_framebuffer_new(GLcontext *ctx, GLuint name)
 }
 
 struct gl_framebuffer *
-nouveau_framebuffer_dri_new(const GLvisual *visual)
+nouveau_framebuffer_dri_new(const struct gl_config *visual)
 {
        struct nouveau_framebuffer *nfb;
 
@@ -195,7 +232,7 @@ nouveau_framebuffer_dri_new(const GLvisual *visual)
 }
 
 static void
-nouveau_bind_framebuffer(GLcontext *ctx, GLenum target,
+nouveau_bind_framebuffer(struct gl_context *ctx, GLenum target,
                         struct gl_framebuffer *dfb,
                         struct gl_framebuffer *rfb)
 {
@@ -203,7 +240,7 @@ nouveau_bind_framebuffer(GLcontext *ctx, GLenum target,
 }
 
 static void
-nouveau_framebuffer_renderbuffer(GLcontext *ctx, struct gl_framebuffer *fb,
+nouveau_framebuffer_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
                                 GLenum attachment, struct gl_renderbuffer *rb)
 {
        _mesa_framebuffer_renderbuffer(ctx, fb, attachment, rb);
@@ -227,7 +264,7 @@ get_tex_format(struct gl_texture_image *ti)
 }
 
 static void
-nouveau_render_texture(GLcontext *ctx, struct gl_framebuffer *fb,
+nouveau_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
                       struct gl_renderbuffer_attachment *att)
 {
        struct gl_renderbuffer *rb = att->Renderbuffer;
@@ -255,7 +292,7 @@ nouveau_render_texture(GLcontext *ctx, struct gl_framebuffer *fb,
 }
 
 static void
-nouveau_finish_render_texture(GLcontext *ctx,
+nouveau_finish_render_texture(struct gl_context *ctx,
                              struct gl_renderbuffer_attachment *att)
 {
        texture_dirty(att->Texture);
@@ -267,6 +304,8 @@ nouveau_fbo_functions_init(struct dd_function_table *functions)
 #if FEATURE_EXT_framebuffer_object
        functions->NewFramebuffer = nouveau_framebuffer_new;
        functions->NewRenderbuffer = nouveau_renderbuffer_new;
+       functions->MapRenderbuffer = nouveau_renderbuffer_map;
+       functions->UnmapRenderbuffer = nouveau_renderbuffer_unmap;
        functions->BindFramebuffer = nouveau_bind_framebuffer;
        functions->FramebufferRenderbuffer = nouveau_framebuffer_renderbuffer;
        functions->RenderTexture = nouveau_render_texture;