*
*/
+#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);
}
}
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;
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(
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;
}