nouveau: move nv10 clear command, for usage by other gpu
authorPatrice Mandin <pmandin@caramail.com>
Sat, 6 Oct 2007 00:30:24 +0000 (02:30 +0200)
committerPatrice Mandin <pmandin@caramail.com>
Sat, 6 Oct 2007 00:30:24 +0000 (02:30 +0200)
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_context.h
src/mesa/drivers/dri/nouveau/nouveau_driver.c
src/mesa/drivers/dri/nouveau/nv10_state.c

index f36483a3d49450f0d7161ff8e1adb3a1228bac3b..a8569a9f1537fed0f5154ddd29d84fcc959ec0bb 100644 (file)
@@ -378,3 +378,39 @@ void nouveauCopySubBuffer(__DRIdrawablePrivate *dPriv,
 {
 }
 
+void nouveauClearBuffer(GLcontext *ctx, nouveau_renderbuffer_t *buffer,
+       int fill, int mask)
+{
+       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+       int dimensions;
+
+       if (!buffer) {
+               return;
+       }
+
+       /* FIXME: only support 32 bits atm */
+
+       /* Surface that we will work on */
+       nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
+
+       BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_FORMAT, 4);
+       OUT_RING(0x0b); /* Y32 color format */
+       OUT_RING((buffer->pitch<<16)|buffer->pitch);
+       OUT_RING(buffer->offset);
+       OUT_RING(buffer->offset);
+
+       /* Now clear a rectangle */
+       dimensions = ((buffer->mesa.Height)<<16) | (buffer->mesa.Width);
+
+       nouveauObjectOnSubchannel(nmesa, NvSubGdiRectText, NvGdiRectText);
+
+       BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
+       OUT_RING(3);    /* SRCCOPY */
+
+       BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_BLOCK_LEVEL1_TL, 5);
+       OUT_RING(0);    /* top left */
+       OUT_RING(dimensions);   /* bottom right */
+       OUT_RING(fill);
+       OUT_RING(0);    /* top left */
+       OUT_RING(dimensions);   /* bottom right */
+}
index 77fe13a9cdc9414f2f88ea954727669a9ff86134..9aff0ee668b28fe1905fc70edf2079facea86f9b 100644 (file)
@@ -133,9 +133,6 @@ typedef struct nouveau_context {
        nouveau_renderbuffer_t *color_buffer;
        nouveau_renderbuffer_t *depth_buffer;
 
-       /* Color buffer clear value */
-       uint32_t clear_color_value;
-
        /* Depth/stencil clear value */
        uint32_t clear_value;
 
@@ -234,6 +231,9 @@ extern void nouveauSwapBuffers(__DRIdrawablePrivate *dPriv);
 extern void nouveauCopySubBuffer(__DRIdrawablePrivate *dPriv,
                                 int x, int y, int w, int h);
 
+extern void nouveauClearBuffer(GLcontext *ctx, nouveau_renderbuffer_t *buffer,
+       int fill, int mask);
+
 /* Debugging utils: */
 extern int NOUVEAU_DEBUG;
 
index 4851c6683560c0fa8f810d11ba981b1352e20e51..8b76779002bd8403cf5bcf591f1242285d5e619a 100644 (file)
@@ -35,6 +35,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "framebuffer.h"
 
 #include "utils.h"
+#include "colormac.h"
 
 /* Wrapper for DRM_NOUVEAU_GETPARAM ioctl */
 GLboolean nouveauDRMGetParam(nouveauContextPtr nmesa,
@@ -135,7 +136,74 @@ static void nouveauFinish( GLcontext *ctx )
 /* glClear */
 static void nouveauClear( GLcontext *ctx, GLbitfield mask )
 {
-       // XXX we really should do something here...
+       uint32_t clear_value;
+       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+       /* FIXME: should we clear front buffer, even if asked to do it? */
+       if (mask & (BUFFER_BIT_FRONT_LEFT|BUFFER_BIT_BACK_LEFT)) {
+               GLubyte c[4];
+               int color_bits = 32;
+               int color_mask = 0xffffffff;
+
+               UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,ctx->Color.ClearColor);
+               clear_value = PACK_COLOR_8888(c[3],c[0],c[1],c[2]);
+
+               if (ctx->DrawBuffer) {
+                       /* FIXME: find correct color buffer, instead of [0][0] */
+                       if (ctx->DrawBuffer->_ColorDrawBuffers[0][0]) {
+                               color_bits = ctx->DrawBuffer->_ColorDrawBuffers[0][0]->RedBits;
+                               color_bits += ctx->DrawBuffer->_ColorDrawBuffers[0][0]->GreenBits;
+                               color_bits += ctx->DrawBuffer->_ColorDrawBuffers[0][0]->BlueBits;
+                               color_bits += ctx->DrawBuffer->_ColorDrawBuffers[0][0]->AlphaBits;
+                       }
+               }
+
+               if (color_bits<24) {
+                       clear_value = PACK_COLOR_565(c[0],c[1],c[2]);
+                       color_mask = 0xffff;
+               }
+
+               nouveauClearBuffer(ctx, nmesa->color_buffer,
+                       clear_value, color_mask);
+       }
+
+       if (mask & (BUFFER_BIT_DEPTH)) {
+               int depth_bits = 24;
+               int depth_mask;
+               if (ctx->DrawBuffer) {
+                       if (ctx->DrawBuffer->_DepthBuffer) {
+                               depth_bits = ctx->DrawBuffer->_DepthBuffer->DepthBits;
+                       }
+               }
+
+               switch(depth_bits) {
+                       case 16:
+                               clear_value = (uint32_t) (ctx->Depth.Clear * 32767.0);
+                               depth_mask = 0xffff;
+                               break;
+                       default:
+                               clear_value = ((uint32_t) (ctx->Depth.Clear * 16777215.0)) << 8;
+                               depth_mask = 0xffffff00;
+                               break;
+               }
+
+               nouveauClearBuffer(ctx, nmesa->depth_buffer,
+                       clear_value, depth_mask);
+       }
+
+       if (mask & (BUFFER_BIT_STENCIL)) {
+               int stencil_bits = 0;
+               if (ctx->DrawBuffer) {
+                       if (ctx->DrawBuffer->_StencilBuffer) {
+                               stencil_bits = ctx->DrawBuffer->_StencilBuffer->StencilBits;
+                       }
+               }
+
+               if (stencil_bits>0) {
+                       nouveauClearBuffer(ctx, nmesa->depth_buffer,
+                               ctx->Stencil.Clear, (1<<stencil_bits)-1);
+               }       
+       }
 }
 
 void nouveauDriverInitFunctions( struct dd_function_table *functions )
index 8cbe72020fe57032dd8e9dce3846b4a9b399d758..3e5bfe093f98beb5433ef277653e0661579b0d6f 100644 (file)
@@ -110,91 +110,19 @@ static void nv10BlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, GLenum dfac
        OUT_RING_CACHE(dfactorRGB);
 }
 
-static void nv10ClearBuffer(GLcontext *ctx, nouveau_renderbuffer_t *buffer, int fill, int mask)
-{
-       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       int dimensions;
-
-       if (!buffer) {
-               return;
-       }
-
-       /* Surface that we will work on */
-       nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
-
-       BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_FORMAT, 4);
-       OUT_RING(0x0b); /* Y32 color format */
-       OUT_RING((buffer->pitch<<16)|buffer->pitch);
-       OUT_RING(buffer->offset);
-       OUT_RING(buffer->offset);
-
-       /* Now clear a rectangle */
-       dimensions = ((buffer->mesa.Height)<<16) | (buffer->mesa.Width);
-
-       nouveauObjectOnSubchannel(nmesa, NvSubGdiRectText, NvGdiRectText);
-
-       BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
-       OUT_RING(3);    /* SRCCOPY */
-
-       BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_BLOCK_LEVEL1_TL, 5);
-       OUT_RING(0);    /* top left */
-       OUT_RING(dimensions);   /* bottom right */
-       OUT_RING(fill);
-       OUT_RING(0);    /* top left */
-       OUT_RING(dimensions);   /* bottom right */
-}
-
-static void nv10Clear(GLcontext *ctx, GLbitfield mask)
-{
-       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-
-       if (mask & (BUFFER_BIT_FRONT_LEFT|BUFFER_BIT_BACK_LEFT)) {
-               nv10ClearBuffer(ctx, nmesa->color_buffer,
-                       nmesa->clear_color_value, 0xffffffff);
-       }
-       /* FIXME: check depth bits */
-       if (mask & (BUFFER_BIT_DEPTH)) {
-               nv10ClearBuffer(ctx, nmesa->depth_buffer,
-                       nmesa->clear_value, 0xffffff00);
-       }
-       /* FIXME: check about stencil? */
-       if (mask & (BUFFER_BIT_STENCIL)) {
-               nv10ClearBuffer(ctx, nmesa->depth_buffer,
-                       nmesa->clear_value, 0x000000ff);
-       }
-}
-
 static void nv10ClearColor(GLcontext *ctx, const GLfloat color[4])
 {
-       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       GLubyte c[4];
-       UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,color);
-       nmesa->clear_color_value = PACK_COLOR_8888(c[3],c[0],c[1],c[2]);
+       /* Not for NV10 */
 }
 
 static void nv10ClearDepth(GLcontext *ctx, GLclampd d)
 {
-       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-
-/*     switch (ctx->DrawBuffer->_DepthBuffer->DepthBits) {
-               case 16:
-                       nmesa->clear_value = (uint32_t)(d*0x7FFF);
-                       break;
-               case 24:*/
-                       nmesa->clear_value = ((nmesa->clear_value&0x000000FF) |
-                               (((uint32_t)(d*0xFFFFFF))<<8));
-/*                     break;
-       }*/
+       /* Not for NV10 */
 }
 
 static void nv10ClearStencil(GLcontext *ctx, GLint s)
 {
-       nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-
-/*     if (ctx->DrawBuffer->_DepthBuffer->DepthBits == 24) {*/
-               nmesa->clear_value = ((nmesa->clear_value&0xFFFFFF00)|
-                       (s&0x000000FF));
-/*     }*/
+       /* Not for NV10 */
 }
 
 static void nv10ClipPlane(GLcontext *ctx, GLenum plane, const GLfloat *equation)
@@ -1037,10 +965,10 @@ void nv10InitStateFuncs(GLcontext *ctx, struct dd_function_table *func)
        func->BlendColor                = nv10BlendColor;
        func->BlendEquationSeparate     = nv10BlendEquationSeparate;
        func->BlendFuncSeparate         = nv10BlendFuncSeparate;
-       func->Clear                     = nv10Clear;
-       func->ClearColor                = nv10ClearColor;
-       func->ClearDepth                = nv10ClearDepth;
-       func->ClearStencil              = nv10ClearStencil;
+/*     func->Clear                     = nv10Clear;*/          /* Not for NV10 */
+       func->ClearColor                = nv10ClearColor;       /* Not for NV10 */
+       func->ClearDepth                = nv10ClearDepth;       /* Not for NV10 */
+       func->ClearStencil              = nv10ClearStencil;     /* Not for NV10 */
        func->ClipPlane                 = nv10ClipPlane;
        func->ColorMask                 = nv10ColorMask;
        func->ColorMaterial             = nv10ColorMaterial;