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.
27 #include "main/mtypes.h"
28 #include "main/fbobject.h"
30 #include "nouveau_driver.h"
31 #include "nouveau_context.h"
32 #include "nouveau_fbo.h"
33 #include "nouveau_util.h"
35 #include "drivers/common/meta.h"
37 static const GLubyte
*
38 nouveau_get_string(struct gl_context
*ctx
, GLenum name
)
40 static char buffer
[128];
41 char hardware_name
[32];
45 return (GLubyte
*)"Nouveau";
48 sprintf(hardware_name
, "nv%02X", context_chipset(ctx
));
49 driGetRendererString(buffer
, hardware_name
, 0);
51 return (GLubyte
*)buffer
;
58 nouveau_flush(struct gl_context
*ctx
)
60 struct nouveau_context
*nctx
= to_nouveau_context(ctx
);
61 struct nouveau_pushbuf
*push
= context_push(ctx
);
65 if (_mesa_is_winsys_fbo(ctx
->DrawBuffer
) &&
66 ctx
->DrawBuffer
->_ColorDrawBufferIndexes
[0] == BUFFER_FRONT_LEFT
) {
67 __DRIscreen
*screen
= nctx
->screen
->dri_screen
;
68 __DRIdri2LoaderExtension
*dri2
= screen
->dri2
.loader
;
69 __DRIdrawable
*drawable
= nctx
->dri_context
->driDrawablePriv
;
71 if (drawable
&& drawable
->loaderPrivate
)
72 dri2
->flushFrontBuffer(drawable
, drawable
->loaderPrivate
);
77 nouveau_finish(struct gl_context
*ctx
)
79 struct nouveau_context
*nctx
= to_nouveau_context(ctx
);
80 struct nouveau_pushbuf
*push
= context_push(ctx
);
81 struct nouveau_pushbuf_refn refn
=
82 { nctx
->fence
, NOUVEAU_BO_VRAM
| NOUVEAU_BO_RDWR
};
86 if (!nouveau_pushbuf_space(push
, 16, 0, 0) &&
87 !nouveau_pushbuf_refn(push
, &refn
, 1)) {
92 nouveau_bo_wait(nctx
->fence
, NOUVEAU_BO_RDWR
, context_client(ctx
));
96 nouveau_clear(struct gl_context
*ctx
, GLbitfield buffers
)
98 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
102 nouveau_validate_framebuffer(ctx
);
103 get_scissors(fb
, &x
, &y
, &w
, &h
);
105 for (i
= 0; i
< BUFFER_COUNT
; i
++) {
106 struct nouveau_surface
*s
;
107 unsigned mask
, value
;
109 buf
= buffers
& (1 << i
);
113 s
= &to_nouveau_renderbuffer(
114 fb
->Attachment
[i
].Renderbuffer
)->surface
;
116 if (buf
& BUFFER_BITS_COLOR
) {
117 mask
= pack_rgba_i(s
->format
, ctx
->Color
.ColorMask
[0]);
118 value
= pack_rgba_clamp_f(s
->format
, ctx
->Color
.ClearColor
.f
);
121 context_drv(ctx
)->surface_fill(
122 ctx
, s
, mask
, value
, x
, y
, w
, h
);
126 } else if (buf
& (BUFFER_BIT_DEPTH
| BUFFER_BIT_STENCIL
)) {
127 mask
= pack_zs_i(s
->format
,
128 (buffers
& BUFFER_BIT_DEPTH
&&
129 ctx
->Depth
.Mask
) ? ~0 : 0,
130 (buffers
& BUFFER_BIT_STENCIL
?
131 ctx
->Stencil
.WriteMask
[0] : 0));
132 value
= pack_zs_f(s
->format
,
137 context_drv(ctx
)->surface_fill(
138 ctx
, s
, mask
, value
, x
, y
, w
, h
);
140 buffers
&= ~(BUFFER_BIT_DEPTH
| BUFFER_BIT_STENCIL
);
145 _mesa_meta_Clear(ctx
, buffers
);
149 nouveau_driver_functions_init(struct dd_function_table
*functions
)
151 functions
->GetString
= nouveau_get_string
;
152 functions
->Flush
= nouveau_flush
;
153 functions
->Finish
= nouveau_finish
;
154 functions
->Clear
= nouveau_clear
;
155 functions
->DrawPixels
= _mesa_meta_DrawPixels
;
156 functions
->CopyPixels
= _mesa_meta_CopyPixels
;
157 functions
->Bitmap
= _mesa_meta_Bitmap
;
158 functions
->BlitFramebuffer
= _mesa_meta_BlitFramebuffer
;