vbo: pass the stream from DrawTransformFeedbackStream to drivers
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_driver.c
index bf0e20ca81ce352fb8065de42a5a016cae56effe..7f31b2851e4aafc6aeda86ddac065c86e0b091b6 100644 (file)
  *
  */
 
+#include <stdio.h>
+#include "main/mtypes.h"
+#include "main/fbobject.h"
+
 #include "nouveau_driver.h"
 #include "nouveau_context.h"
 #include "nouveau_fbo.h"
 
 #include "drivers/common/meta.h"
 
-static const GLubyte *
-nouveau_get_string(GLcontext *ctx, GLenum name)
+const char const *nouveau_vendor_string = "Nouveau";
+
+const char *
+nouveau_get_renderer_string(unsigned chipset)
 {
-       static char buffer[128];
        char hardware_name[32];
+       static char buffer[128];
 
+       snprintf(hardware_name, sizeof(hardware_name), "nv%02X", chipset);
+       driGetRendererString(buffer, hardware_name, 0);
+
+       return buffer;
+}
+
+static const GLubyte *
+nouveau_get_string(struct gl_context *ctx, GLenum name)
+{
        switch (name) {
                case GL_VENDOR:
-                       return (GLubyte *)"Nouveau";
+                       return (GLubyte *)nouveau_vendor_string;
 
                case GL_RENDERER:
-                       sprintf(hardware_name, "nv%02X", context_chipset(ctx));
-                       driGetRendererString(buffer, hardware_name, DRIVER_DATE, 0);
-
-                       return (GLubyte *)buffer;
+                       return (GLubyte *)nouveau_get_renderer_string(context_chipset(ctx));
                default:
                        return NULL;
        }
 }
 
 static void
-nouveau_flush(GLcontext *ctx)
+nouveau_flush(struct gl_context *ctx)
 {
        struct nouveau_context *nctx = to_nouveau_context(ctx);
-       struct nouveau_channel *chan = context_chan(ctx);
+       struct nouveau_pushbuf *push = context_push(ctx);
 
-       FIRE_RING(chan);
+       PUSH_KICK(push);
 
-       if (ctx->DrawBuffer->Name == 0 &&
+       if (_mesa_is_winsys_fbo(ctx->DrawBuffer) &&
            ctx->DrawBuffer->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT) {
                __DRIscreen *screen = nctx->screen->dri_screen;
-               __DRIdri2LoaderExtension *dri2 = screen->dri2.loader;
+               const __DRIdri2LoaderExtension *dri2 = screen->dri2.loader;
                __DRIdrawable *drawable = nctx->dri_context->driDrawablePriv;
 
-               dri2->flushFrontBuffer(drawable, drawable->loaderPrivate);
+               if (drawable && drawable->loaderPrivate)
+                       dri2->flushFrontBuffer(drawable, drawable->loaderPrivate);
        }
-
-       nctx->drawable.dirty = GL_FALSE;
 }
 
 static void
-nouveau_finish(GLcontext *ctx)
+nouveau_finish(struct gl_context *ctx)
 {
+       struct nouveau_context *nctx = to_nouveau_context(ctx);
+       struct nouveau_pushbuf *push = context_push(ctx);
+       struct nouveau_pushbuf_refn refn =
+               { nctx->fence, NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR };
+
        nouveau_flush(ctx);
+
+       if (!nouveau_pushbuf_space(push, 16, 0, 0) &&
+           !nouveau_pushbuf_refn(push, &refn, 1)) {
+               PUSH_DATA(push, 0);
+               PUSH_KICK(push);
+       }
+
+       nouveau_bo_wait(nctx->fence, NOUVEAU_BO_RDWR, context_client(ctx));
 }
 
 void
-nouveau_clear(GLcontext *ctx, GLbitfield buffers)
+nouveau_clear(struct gl_context *ctx, GLbitfield buffers)
 {
        struct gl_framebuffer *fb = ctx->DrawBuffer;
        int x, y, w, h;
@@ -96,11 +120,19 @@ nouveau_clear(GLcontext *ctx, GLbitfield buffers)
                        continue;
 
                s = &to_nouveau_renderbuffer(
-                       fb->Attachment[i].Renderbuffer->Wrapped)->surface;
+                       fb->Attachment[i].Renderbuffer)->surface;
 
                if (buf & BUFFER_BITS_COLOR) {
+                       const float *color = ctx->Color.ClearColor.f;
+
+                       if (fb->Attachment[i].Renderbuffer->_BaseFormat ==
+                           GL_LUMINANCE_ALPHA)
+                               value = pack_la_clamp_f(
+                                               s->format, color[0], color[3]);
+                       else
+                               value = pack_rgba_clamp_f(s->format, color);
+
                        mask = pack_rgba_i(s->format, ctx->Color.ColorMask[0]);
-                       value = pack_rgba_f(s->format, ctx->Color.ClearColor);
 
                        if (mask)
                                context_drv(ctx)->surface_fill(
@@ -112,8 +144,8 @@ nouveau_clear(GLcontext *ctx, GLbitfield buffers)
                        mask = pack_zs_i(s->format,
                                         (buffers & BUFFER_BIT_DEPTH &&
                                          ctx->Depth.Mask) ? ~0 : 0,
-                                        (buffers & BUFFER_BIT_STENCIL &&
-                                         ctx->Stencil.WriteMask[0]) ? ~0 : 0);
+                                        (buffers & BUFFER_BIT_STENCIL ?
+                                         ctx->Stencil.WriteMask[0] : 0));
                        value = pack_zs_f(s->format,
                                          ctx->Depth.Clear,
                                          ctx->Stencil.Clear);
@@ -137,4 +169,8 @@ nouveau_driver_functions_init(struct dd_function_table *functions)
        functions->Flush = nouveau_flush;
        functions->Finish = nouveau_finish;
        functions->Clear = nouveau_clear;
+       functions->DrawPixels = _mesa_meta_DrawPixels;
+       functions->CopyPixels = _mesa_meta_CopyPixels;
+       functions->Bitmap = _mesa_meta_Bitmap;
+       functions->BlitFramebuffer = _mesa_meta_and_swrast_BlitFramebuffer;
 }