X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fnouveau%2Fnouveau_driver.c;h=998e751fc3c722fa5b1e04701b8c7fafc70d907d;hb=14f21f53d50ecd6e2803b2326a90e93aceacfe24;hp=4ec864c181c23165b10d44da033d278e6362218c;hpb=ee30e24f5f9cc2ec6c5a3edbe498e5e0334f788b;p=mesa.git diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c index 4ec864c181c..998e751fc3c 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c @@ -24,6 +24,10 @@ * */ +#include +#include "main/mtypes.h" +#include "main/fbobject.h" + #include "nouveau_driver.h" #include "nouveau_context.h" #include "nouveau_fbo.h" @@ -31,52 +35,74 @@ #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; @@ -94,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( @@ -138,5 +172,5 @@ nouveau_driver_functions_init(struct dd_function_table *functions) functions->DrawPixels = _mesa_meta_DrawPixels; functions->CopyPixels = _mesa_meta_CopyPixels; functions->Bitmap = _mesa_meta_Bitmap; - functions->BlitFramebuffer = _mesa_meta_BlitFramebuffer; + functions->BlitFramebuffer = _mesa_meta_and_swrast_BlitFramebuffer; }