Implement a simple nv30Clear, and make sure we get a nouveau_renderbuffer
authorBen Skeggs <darktama@iinet.net.au>
Fri, 8 Dec 2006 11:45:39 +0000 (11:45 +0000)
committerBen Skeggs <darktama@iinet.net.au>
Fri, 8 Dec 2006 11:45:39 +0000 (11:45 +0000)
    for the depth buffer and not a Mesa renderbuffer adaptor

src/mesa/drivers/dri/nouveau/nouveau_buffers.c
src/mesa/drivers/dri/nouveau/nv30_state.c

index a356fd1..42d8691 100644 (file)
@@ -239,7 +239,10 @@ nouveau_build_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
    _mesa_update_draw_buffer_bounds(ctx);
 
    color[0] = (nouveau_renderbuffer *)fb->_ColorDrawBuffers[0][0];
-   depth    = (nouveau_renderbuffer *)fb->_DepthBuffer;
+   if (fb->_DepthBuffer && fb->_DepthBuffer->Wrapped)
+      depth = (nouveau_renderbuffer *)fb->_DepthBuffer->Wrapped;
+   else
+      depth = (nouveau_renderbuffer *)fb->_DepthBuffer;
 
    if (!nmesa->hw_func.BindBuffers(nmesa, 1, color, depth))
       return GL_FALSE;
index 3228320..aab0bd9 100644 (file)
@@ -79,6 +79,23 @@ static void nv30BlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, GLenum dfac
        OUT_RING_CACHE((dfactorA<<16) | dfactorRGB);
 }
 
+static void nv30Clear(GLcontext *ctx, GLbitfield mask)
+{
+       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+       GLuint hw_bufs = 0;
+
+       if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT))
+               hw_bufs |= 0xf0;
+       if (mask & (BUFFER_BIT_DEPTH))
+               hw_bufs |= 0x03;
+
+       if (hw_bufs) {
+               /* should we flush the state cache before this? */
+               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_WHICH_BUFFERS, 1);
+               OUT_RING(hw_bufs);
+       }
+}
+
 static void nv30ClearColor(GLcontext *ctx, const GLfloat color[4])
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
@@ -740,6 +757,7 @@ void nv30InitStateFuncs(GLcontext *ctx, struct dd_function_table *func)
        func->BlendColor                = nv30BlendColor;
        func->BlendEquationSeparate     = nv30BlendEquationSeparate;
        func->BlendFuncSeparate         = nv30BlendFuncSeparate;
+       func->Clear                     = nv30Clear;
        func->ClearColor                = nv30ClearColor;
        func->ClearDepth                = nv30ClearDepth;
        func->ClearStencil              = nv30ClearStencil;