Merge commit 'origin/master' into i965g-restart
[mesa.git] / src / gallium / drivers / i965 / brw_pipe_fb.c
1 #include "util/u_math.h"
2 #include "pipe/p_context.h"
3 #include "pipe/p_state.h"
4
5 #include "brw_context.h"
6
7 /**
8 * called from intelDrawBuffer()
9 */
10 static void brw_set_framebuffer_state( struct pipe_context *pipe,
11 const struct pipe_framebuffer_state *fb )
12 {
13 struct brw_context *brw = brw_context(pipe);
14 unsigned i;
15
16 /* Dimensions:
17 */
18 if (brw->curr.fb.width != fb->width ||
19 brw->curr.fb.height != fb->height) {
20 brw->curr.fb.width = fb->width;
21 brw->curr.fb.height = fb->height;
22 brw->state.dirty.mesa |= PIPE_NEW_FRAMEBUFFER_DIMENSIONS;
23 }
24
25 /* Z/Stencil
26 */
27 if (brw->curr.fb.zsbuf != fb->zsbuf) {
28 pipe_surface_reference(&brw->curr.fb.zsbuf, fb->zsbuf);
29 brw->state.dirty.mesa |= PIPE_NEW_DEPTH_BUFFER;
30 }
31
32 /* Color buffers:
33 */
34 for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
35 if (brw->curr.fb.cbufs[i] != fb->cbufs[i]) {
36 brw->state.dirty.mesa |= PIPE_NEW_COLOR_BUFFERS;
37 pipe_surface_reference(&brw->curr.fb.cbufs[i], fb->cbufs[i]);
38 }
39 }
40
41 if (brw->curr.fb.nr_cbufs != fb->nr_cbufs) {
42 brw->curr.fb.nr_cbufs = MIN2(BRW_MAX_DRAW_BUFFERS, fb->nr_cbufs);
43 brw->state.dirty.mesa |= PIPE_NEW_NR_CBUFS;
44 }
45 }
46
47
48 static void brw_set_viewport_state( struct pipe_context *pipe,
49 const struct pipe_viewport_state *viewport )
50 {
51 struct brw_context *brw = brw_context(pipe);
52
53 brw->curr.viewport = *viewport;
54 brw->curr.ccv.min_depth = 0.0; /* XXX: near */
55 brw->curr.ccv.max_depth = 1.0; /* XXX: far */
56
57 brw->state.dirty.mesa |= PIPE_NEW_VIEWPORT;
58 }
59
60
61 void brw_pipe_framebuffer_init( struct brw_context *brw )
62 {
63 brw->base.set_framebuffer_state = brw_set_framebuffer_state;
64 brw->base.set_viewport_state = brw_set_viewport_state;
65 }
66
67 void brw_pipe_framebuffer_cleanup( struct brw_context *brw )
68 {
69 struct pipe_framebuffer_state *fb = &brw->curr.fb;
70 int i;
71
72 for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
73 pipe_surface_reference(&fb->cbufs[i], NULL);
74 }
75
76 pipe_surface_reference(&fb->zsbuf, NULL);
77 }