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 "util/u_inlines.h"
27
#include "pipe/p_defines.h"
28
#include "util/u_math.h"
29
#include "util/u_upload_mgr.h"
30
 
31
#include "svga_context.h"
32
#include "svga_state.h"
33
#include "svga_draw.h"
34
#include "svga_tgsi.h"
35
#include "svga_screen.h"
36
#include "svga_resource_buffer.h"
37
#include "svga_hw_reg.h"
38
 
39
 
40
 
41
static enum pipe_error
42
emit_hw_vs_vdecl(struct svga_context *svga, unsigned dirty)
43
{
44
   const struct pipe_vertex_element *ve = svga->curr.velems->velem;
45
   SVGA3dVertexDecl decl;
46
   unsigned i;
47
   unsigned neg_bias = 0;
48
 
49
   assert(svga->curr.velems->count >=
50
          svga->curr.vs->base.info.file_count[TGSI_FILE_INPUT]);
51
 
52
   svga_hwtnl_reset_vdecl( svga->hwtnl,
53
                           svga->curr.velems->count );
54
 
55
   /**
56
    * We can't set the VDECL offset to something negative, so we
57
    * must calculate a common negative additional index bias, and modify
58
    * the VDECL offsets accordingly so they *all* end up positive.
59
    *
60
    * Note that the exact value of the negative index bias is not that
61
    * important, since we compensate for it when we calculate the vertex
62
    * buffer offset below. The important thing is that all vertex buffer
63
    * offsets remain positive.
64
    *
65
    * Note that we use a negative bias variable in order to make the
66
    * rounding maths more easy to follow, and to avoid int / unsigned
67
    * confusion.
68
    */
69
 
70
   for (i = 0; i < svga->curr.velems->count; i++) {
71
      const struct pipe_vertex_buffer *vb =
72
         &svga->curr.vb[ve[i].vertex_buffer_index];
73
      struct svga_buffer *buffer;
74
      unsigned int offset = vb->buffer_offset + ve[i].src_offset;
75
      unsigned tmp_neg_bias = 0;
76
 
77
      if (!vb->buffer)
78
         continue;
79
 
80
      buffer = svga_buffer(vb->buffer);
81
      if (buffer->uploaded.start > offset) {
82
         tmp_neg_bias = buffer->uploaded.start - offset;
83
         if (vb->stride)
84
            tmp_neg_bias = (tmp_neg_bias + vb->stride - 1) / vb->stride;
85
         neg_bias = MAX2(neg_bias, tmp_neg_bias);
86
      }
87
   }
88
 
89
   for (i = 0; i < svga->curr.velems->count; i++) {
90
      const struct pipe_vertex_buffer *vb =
91
         &svga->curr.vb[ve[i].vertex_buffer_index];
92
      unsigned usage, index;
93
      struct svga_buffer *buffer;
94
 
95
      if (!vb->buffer)
96
         continue;
97
 
98
      buffer= svga_buffer(vb->buffer);
99
      svga_generate_vdecl_semantics( i, &usage, &index );
100
 
101
      /* SVGA_NEW_VELEMENT
102
       */
103
      decl.identity.type = svga->state.sw.ve_format[i];
104
      decl.identity.method = SVGA3D_DECLMETHOD_DEFAULT;
105
      decl.identity.usage = usage;
106
      decl.identity.usageIndex = index;
107
      decl.array.stride = vb->stride;
108
 
109
      /* Compensate for partially uploaded vbo, and
110
       * for the negative index bias.
111
       */
112
      decl.array.offset = (vb->buffer_offset
113
                           + ve[i].src_offset
114
			   + neg_bias * vb->stride
115
			   - buffer->uploaded.start);
116
 
117
      assert(decl.array.offset >= 0);
118
 
119
      svga_hwtnl_vdecl( svga->hwtnl,
120
                        i,
121
                        &decl,
122
                        buffer->uploaded.buffer ? buffer->uploaded.buffer :
123
                        vb->buffer );
124
   }
125
 
126
   svga_hwtnl_set_index_bias( svga->hwtnl, -(int) neg_bias );
127
   return PIPE_OK;
128
}
129
 
130
 
131
static enum pipe_error
132
emit_hw_vdecl(struct svga_context *svga, unsigned dirty)
133
{
134
   /* SVGA_NEW_NEED_SWTNL
135
    */
136
   if (svga->state.sw.need_swtnl)
137
      return PIPE_OK; /* Do not emit during swtnl */
138
 
139
   return emit_hw_vs_vdecl( svga, dirty );
140
}
141
 
142
 
143
struct svga_tracked_state svga_hw_vdecl =
144
{
145
   "hw vertex decl state (hwtnl version)",
146
   ( SVGA_NEW_NEED_SWTNL |
147
     SVGA_NEW_VELEMENT |
148
     SVGA_NEW_VBUFFER |
149
     SVGA_NEW_RAST |
150
     SVGA_NEW_FS |
151
     SVGA_NEW_VS ),
152
   emit_hw_vdecl
153
};