Tizen 2.0 Release
[profile/ivi/osmesa.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 #include "util/u_inlines.h"
5
6 #include "brw_context.h"
7
8 /**
9  * called from intelDrawBuffer()
10  */
11 static void brw_set_framebuffer_state( struct pipe_context *pipe, 
12                                        const struct pipe_framebuffer_state *fb )
13 {
14    struct brw_context *brw = brw_context(pipe);
15    unsigned i;
16
17    /* Dimensions:
18     */
19    if (brw->curr.fb.width != fb->width ||
20        brw->curr.fb.height != fb->height) {
21       brw->curr.fb.width = fb->width;
22       brw->curr.fb.height = fb->height;
23       brw->state.dirty.mesa |= PIPE_NEW_FRAMEBUFFER_DIMENSIONS;
24    }
25    
26    /* Z/Stencil
27     */
28    if (brw->curr.fb.zsbuf != fb->zsbuf) {
29       pipe_surface_reference(&brw->curr.fb.zsbuf, fb->zsbuf);
30       brw->state.dirty.mesa |= PIPE_NEW_DEPTH_BUFFER;
31    }
32
33    /* Color buffers:
34     */
35    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
36       if (brw->curr.fb.cbufs[i] != fb->cbufs[i]) {
37          brw->state.dirty.mesa |= PIPE_NEW_COLOR_BUFFERS;
38          pipe_surface_reference(&brw->curr.fb.cbufs[i], fb->cbufs[i]);
39       }
40    }
41    
42    if (brw->curr.fb.nr_cbufs != fb->nr_cbufs) {
43       brw->curr.fb.nr_cbufs = MIN2(BRW_MAX_DRAW_BUFFERS, fb->nr_cbufs);
44       brw->state.dirty.mesa |= PIPE_NEW_NR_CBUFS;
45    }
46 }
47
48
49 static void brw_set_viewport_state( struct pipe_context *pipe,
50                                     const struct pipe_viewport_state *viewport )
51 {
52    struct brw_context *brw = brw_context(pipe);
53
54    brw->curr.viewport = *viewport;
55    brw->curr.ccv.min_depth = viewport->scale[2] * -1.0 + viewport->translate[2];
56    brw->curr.ccv.max_depth = viewport->scale[2] *  1.0 + viewport->translate[2];
57
58    if (0)
59       debug_printf("%s depth range %f .. %f\n",
60                    __FUNCTION__,
61                    brw->curr.ccv.min_depth,
62                    brw->curr.ccv.max_depth);
63
64    brw->state.dirty.mesa |= PIPE_NEW_VIEWPORT;
65 }
66
67
68 void brw_pipe_framebuffer_init( struct brw_context *brw )
69 {
70    brw->base.set_framebuffer_state = brw_set_framebuffer_state;
71    brw->base.set_viewport_state = brw_set_viewport_state;
72 }
73
74 void brw_pipe_framebuffer_cleanup( struct brw_context *brw )
75 {
76    struct pipe_framebuffer_state *fb = &brw->curr.fb;
77    int i;
78
79    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
80       pipe_surface_reference(&fb->cbufs[i], NULL);
81    }
82
83    pipe_surface_reference(&fb->zsbuf, NULL);
84 }