Subversion Repositories Kolibri OS

Rev

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
}
188
 
189