Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /********************************************************** |
2 | * Copyright 2008-2009 VMware, Inc. All rights reserved. |
||
3 | * |
||
4 | * Permission is hereby granted, free of charge, to any person |
||
5 | * obtaining a copy of this software and associated documentation |
||
6 | * files (the "Software"), to deal in the Software without |
||
7 | * restriction, including without limitation the rights to use, copy, |
||
8 | * modify, merge, publish, distribute, sublicense, and/or sell copies |
||
9 | * of the Software, and to permit persons to whom the Software is |
||
10 | * furnished to do so, subject to the following conditions: |
||
11 | * |
||
12 | * The above copyright notice and this permission notice shall be |
||
13 | * included in all copies or substantial portions of the Software. |
||
14 | * |
||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||
16 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||
17 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
||
18 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
||
19 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
||
20 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
21 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||
22 | * SOFTWARE. |
||
23 | * |
||
24 | **********************************************************/ |
||
25 | |||
26 | #include "svga_cmd.h" |
||
27 | |||
28 | #include "util/u_inlines.h" |
||
29 | |||
30 | #include "svga_context.h" |
||
31 | #include "svga_surface.h" |
||
32 | |||
33 | |||
34 | static void svga_set_scissor_states( struct pipe_context *pipe, |
||
35 | unsigned start_slot, |
||
36 | unsigned num_scissors, |
||
37 | const struct pipe_scissor_state *scissors ) |
||
38 | { |
||
39 | struct svga_context *svga = svga_context(pipe); |
||
40 | |||
41 | memcpy( &svga->curr.scissor, scissors, sizeof(*scissors) ); |
||
42 | svga->dirty |= SVGA_NEW_SCISSOR; |
||
43 | } |
||
44 | |||
45 | |||
46 | static void svga_set_polygon_stipple( struct pipe_context *pipe, |
||
47 | const struct pipe_poly_stipple *stipple ) |
||
48 | { |
||
49 | /* overridden by the draw module */ |
||
50 | } |
||
51 | |||
52 | |||
53 | void svga_cleanup_framebuffer(struct svga_context *svga) |
||
54 | { |
||
55 | struct pipe_framebuffer_state *curr = &svga->curr.framebuffer; |
||
56 | struct pipe_framebuffer_state *hw = &svga->state.hw_clear.framebuffer; |
||
57 | int i; |
||
58 | |||
59 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { |
||
60 | pipe_surface_reference(&curr->cbufs[i], NULL); |
||
61 | pipe_surface_reference(&hw->cbufs[i], NULL); |
||
62 | } |
||
63 | |||
64 | pipe_surface_reference(&curr->zsbuf, NULL); |
||
65 | pipe_surface_reference(&hw->zsbuf, NULL); |
||
66 | } |
||
67 | |||
68 | |||
69 | #define DEPTH_BIAS_SCALE_FACTOR_D16 ((float)(1<<15)) |
||
70 | #define DEPTH_BIAS_SCALE_FACTOR_D24S8 ((float)(1<<23)) |
||
71 | #define DEPTH_BIAS_SCALE_FACTOR_D32 ((float)(1<<31)) |
||
72 | |||
73 | |||
74 | static void svga_set_framebuffer_state(struct pipe_context *pipe, |
||
75 | const struct pipe_framebuffer_state *fb) |
||
76 | { |
||
77 | struct svga_context *svga = svga_context(pipe); |
||
78 | struct pipe_framebuffer_state *dst = &svga->curr.framebuffer; |
||
79 | boolean propagate = FALSE; |
||
80 | unsigned i; |
||
81 | |||
82 | dst->width = fb->width; |
||
83 | dst->height = fb->height; |
||
84 | dst->nr_cbufs = fb->nr_cbufs; |
||
85 | |||
86 | /* check if we need to propagate any of the target surfaces */ |
||
87 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { |
||
88 | if (dst->cbufs[i] && dst->cbufs[i] != fb->cbufs[i]) |
||
89 | if (svga_surface_needs_propagation(dst->cbufs[i])) |
||
90 | propagate = TRUE; |
||
91 | } |
||
92 | |||
93 | if (propagate) { |
||
94 | /* make sure that drawing calls comes before propagation calls */ |
||
95 | svga_hwtnl_flush_retry( svga ); |
||
96 | |||
97 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) |
||
98 | if (dst->cbufs[i] && dst->cbufs[i] != fb->cbufs[i]) |
||
99 | svga_propagate_surface(svga, dst->cbufs[i]); |
||
100 | } |
||
101 | |||
102 | /* XXX: Actually the virtual hardware may support rendertargets with |
||
103 | * different size, depending on the host API and driver, but since we cannot |
||
104 | * know that make no such assumption here. */ |
||
105 | for(i = 0; i < fb->nr_cbufs; ++i) { |
||
106 | if (fb->zsbuf && fb->cbufs[i]) { |
||
107 | assert(fb->zsbuf->width == fb->cbufs[i]->width); |
||
108 | assert(fb->zsbuf->height == fb->cbufs[i]->height); |
||
109 | } |
||
110 | } |
||
111 | |||
112 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { |
||
113 | pipe_surface_reference(&dst->cbufs[i], |
||
114 | (i < fb->nr_cbufs) ? fb->cbufs[i] : NULL); |
||
115 | } |
||
116 | pipe_surface_reference(&dst->zsbuf, fb->zsbuf); |
||
117 | |||
118 | |||
119 | if (svga->curr.framebuffer.zsbuf) |
||
120 | { |
||
121 | switch (svga->curr.framebuffer.zsbuf->format) { |
||
122 | case PIPE_FORMAT_Z16_UNORM: |
||
123 | svga->curr.depthscale = 1.0f / DEPTH_BIAS_SCALE_FACTOR_D16; |
||
124 | break; |
||
125 | case PIPE_FORMAT_Z24_UNORM_S8_UINT: |
||
126 | case PIPE_FORMAT_Z24X8_UNORM: |
||
127 | case PIPE_FORMAT_S8_UINT_Z24_UNORM: |
||
128 | case PIPE_FORMAT_X8Z24_UNORM: |
||
129 | svga->curr.depthscale = 1.0f / DEPTH_BIAS_SCALE_FACTOR_D24S8; |
||
130 | break; |
||
131 | case PIPE_FORMAT_Z32_UNORM: |
||
132 | svga->curr.depthscale = 1.0f / DEPTH_BIAS_SCALE_FACTOR_D32; |
||
133 | break; |
||
134 | case PIPE_FORMAT_Z32_FLOAT: |
||
135 | svga->curr.depthscale = 1.0f / ((float)(1<<23)); |
||
136 | break; |
||
137 | default: |
||
138 | svga->curr.depthscale = 0.0f; |
||
139 | break; |
||
140 | } |
||
141 | } |
||
142 | else { |
||
143 | svga->curr.depthscale = 0.0f; |
||
144 | } |
||
145 | |||
146 | svga->dirty |= SVGA_NEW_FRAME_BUFFER; |
||
147 | } |
||
148 | |||
149 | |||
150 | |||
151 | static void svga_set_clip_state( struct pipe_context *pipe, |
||
152 | const struct pipe_clip_state *clip ) |
||
153 | { |
||
154 | struct svga_context *svga = svga_context(pipe); |
||
155 | |||
156 | svga->curr.clip = *clip; /* struct copy */ |
||
157 | |||
158 | svga->dirty |= SVGA_NEW_CLIP; |
||
159 | } |
||
160 | |||
161 | |||
162 | |||
163 | /* Called when driver state tracker notices changes to the viewport |
||
164 | * matrix: |
||
165 | */ |
||
166 | static void svga_set_viewport_states( struct pipe_context *pipe, |
||
167 | unsigned start_slot, |
||
168 | unsigned num_viewports, |
||
169 | const struct pipe_viewport_state *viewports ) |
||
170 | { |
||
171 | struct svga_context *svga = svga_context(pipe); |
||
172 | |||
173 | svga->curr.viewport = *viewports; /* struct copy */ |
||
174 | |||
175 | svga->dirty |= SVGA_NEW_VIEWPORT; |
||
176 | } |
||
177 | |||
178 | |||
179 | |||
180 | void svga_init_misc_functions( struct svga_context *svga ) |
||
181 | { |
||
182 | svga->pipe.set_scissor_states = svga_set_scissor_states; |
||
183 | svga->pipe.set_polygon_stipple = svga_set_polygon_stipple; |
||
184 | svga->pipe.set_framebuffer_state = svga_set_framebuffer_state; |
||
185 | svga->pipe.set_clip_state = svga_set_clip_state; |
||
186 | svga->pipe.set_viewport_states = svga_set_viewport_states; |
||
187 | }23)); |
||
188 | |||
189 |