2 * Copyright (C) 2009 Francisco Jerez.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #include "main/mtypes.h"
29 #include "main/fbobject.h"
31 #include "nouveau_driver.h"
32 #include "nouveau_context.h"
33 #include "nouveau_fbo.h"
34 #include "nouveau_util.h"
36 #include "drivers/common/meta.h"
38 const char const *nouveau_vendor_string
= "Nouveau";
41 nouveau_get_renderer_string(unsigned chipset
)
43 char hardware_name
[32];
44 static char buffer
[128];
46 snprintf(hardware_name
, sizeof(hardware_name
), "nv%02X", chipset
);
47 driGetRendererString(buffer
, hardware_name
, 0);
52 static const GLubyte
*
53 nouveau_get_string(struct gl_context
*ctx
, GLenum name
)
57 return (GLubyte
*)nouveau_vendor_string
;
60 return (GLubyte
*)nouveau_get_renderer_string(context_chipset(ctx
));
67 nouveau_flush(struct gl_context
*ctx
)
69 struct nouveau_context
*nctx
= to_nouveau_context(ctx
);
70 struct nouveau_pushbuf
*push
= context_push(ctx
);
74 if (_mesa_is_winsys_fbo(ctx
->DrawBuffer
) &&
75 ctx
->DrawBuffer
->_ColorDrawBufferIndexes
[0] == BUFFER_FRONT_LEFT
) {
76 __DRIscreen
*screen
= nctx
->screen
->dri_screen
;
77 const __DRIdri2LoaderExtension
*dri2
= screen
->dri2
.loader
;
78 __DRIdrawable
*drawable
= nctx
->dri_context
->driDrawablePriv
;
80 if (drawable
&& drawable
->loaderPrivate
)
81 dri2
->flushFrontBuffer(drawable
, drawable
->loaderPrivate
);
86 nouveau_finish(struct gl_context
*ctx
)
88 struct nouveau_context
*nctx
= to_nouveau_context(ctx
);
89 struct nouveau_pushbuf
*push
= context_push(ctx
);
90 struct nouveau_pushbuf_refn refn
=
91 { nctx
->fence
, NOUVEAU_BO_VRAM
| NOUVEAU_BO_RDWR
};
95 if (!nouveau_pushbuf_space(push
, 16, 0, 0) &&
96 !nouveau_pushbuf_refn(push
, &refn
, 1)) {
101 nouveau_bo_wait(nctx
->fence
, NOUVEAU_BO_RDWR
, context_client(ctx
));
105 nouveau_clear(struct gl_context
*ctx
, GLbitfield buffers
)
107 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
111 nouveau_validate_framebuffer(ctx
);
112 get_scissors(fb
, &x
, &y
, &w
, &h
);
114 for (i
= 0; i
< BUFFER_COUNT
; i
++) {
115 struct nouveau_surface
*s
;
116 unsigned mask
, value
;
118 buf
= buffers
& (1 << i
);
122 s
= &to_nouveau_renderbuffer(
123 fb
->Attachment
[i
].Renderbuffer
)->surface
;
125 if (buf
& BUFFER_BITS_COLOR
) {
126 const float *color
= ctx
->Color
.ClearColor
.f
;
128 if (fb
->Attachment
[i
].Renderbuffer
->_BaseFormat
==
130 value
= pack_la_clamp_f(
131 s
->format
, color
[0], color
[3]);
133 value
= pack_rgba_clamp_f(s
->format
, color
);
135 mask
= pack_rgba_i(s
->format
, ctx
->Color
.ColorMask
[0]);
138 context_drv(ctx
)->surface_fill(
139 ctx
, s
, mask
, value
, x
, y
, w
, h
);
143 } else if (buf
& (BUFFER_BIT_DEPTH
| BUFFER_BIT_STENCIL
)) {
144 mask
= pack_zs_i(s
->format
,
145 (buffers
& BUFFER_BIT_DEPTH
&&
146 ctx
->Depth
.Mask
) ? ~0 : 0,
147 (buffers
& BUFFER_BIT_STENCIL
?
148 ctx
->Stencil
.WriteMask
[0] : 0));
149 value
= pack_zs_f(s
->format
,
154 context_drv(ctx
)->surface_fill(
155 ctx
, s
, mask
, value
, x
, y
, w
, h
);
157 buffers
&= ~(BUFFER_BIT_DEPTH
| BUFFER_BIT_STENCIL
);
162 _mesa_meta_Clear(ctx
, buffers
);
166 nouveau_driver_functions_init(struct dd_function_table
*functions
)
168 functions
->GetString
= nouveau_get_string
;
169 functions
->Flush
= nouveau_flush
;
170 functions
->Finish
= nouveau_finish
;
171 functions
->Clear
= nouveau_clear
;
172 functions
->DrawPixels
= _mesa_meta_DrawPixels
;
173 functions
->CopyPixels
= _mesa_meta_CopyPixels
;
174 functions
->Bitmap
= _mesa_meta_Bitmap
;
175 functions
->BlitFramebuffer
= _mesa_meta_and_swrast_BlitFramebuffer
;