1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef DRAW_VS_H
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DRAW_VS_H
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_context.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_private.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_vertex.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_context;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_shader_state;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_variant_input
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned buffer;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned offset;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned instance_divisor;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_variant_output
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum attrib_emit format;     /* output format */
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned vs_output:8;        /* which vertex shader output is this? */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned offset:24;          /* offset into output vertex */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_variant_element {
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_variant_input in;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_variant_output out;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vs_variant_key {
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned output_stride;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nr_elements:8;      /* max2(nr_inputs, nr_outputs) */
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nr_inputs:8;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nr_outputs:8;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned viewport:1;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned clip:1;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned const_vbuffers:5;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_variant_element element[PIPE_MAX_ATTRIBS];
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vs_variant;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vs_variant {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_vs_variant_key key;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_vertex_shader *vs;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*set_buffer)( struct draw_vs_variant *,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned i,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const void *ptr,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned stride,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned max_stride );
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (PIPE_CDECL *run_linear)( struct draw_vs_variant *shader,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned start,
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned count,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  void *output_buffer );
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (PIPE_CDECL *run_elts)( struct draw_vs_variant *shader,
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const unsigned *elts,
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                unsigned count,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                void *output_buffer );
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*destroy)( struct draw_vs_variant * );
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Private version of the compiled vertex_shader
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vertex_shader {
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_context *draw;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This member will disappear shortly:
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_shader_state   state;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_shader_info info;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned position_output;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned edgeflag_output;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned clipvertex_output;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned clipdistance_output[2];
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Extracted from shader:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float (*immediates)[4];
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_vs_variant *variant[16];
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nr_variants;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned last_variant;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_vs_variant *(*create_variant)( struct draw_vertex_shader *shader,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              const struct draw_vs_variant_key *key );
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*prepare)( struct draw_vertex_shader *shader,
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct draw_context *draw );
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Run the shader - this interface will get cleaned up in the
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * future:
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*run_linear)( struct draw_vertex_shader *shader,
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       const float (*input)[4],
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       float (*output)[4],
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const unsigned const_size[PIPE_MAX_CONSTANT_BUFFERS],
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned count,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned input_stride,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned output_stride );
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*delete)( struct draw_vertex_shader * );
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vs_variant *
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_vs_lookup_variant( struct draw_vertex_shader *base,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const struct draw_vs_variant_key *key );
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/********************************************************************************
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Internal functions:
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vertex_shader *
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_create_vs_exec(struct draw_context *draw,
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    const struct pipe_shader_state *templ);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vertex_shader *
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_create_vs_ppc(struct draw_context *draw,
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   const struct pipe_shader_state *templ);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vs_variant_key;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vertex_shader;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vertex_shader *
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_create_vs_llvm(struct draw_context *draw,
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    const struct pipe_shader_state *state);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/********************************************************************************
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helpers for vs implementations that don't do their own fetch/emit variants.
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Means these can be shared between shaders.
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct translate;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct translate_key;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct translate *draw_vs_get_fetch( struct draw_context *draw,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     struct translate_key *key );
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct translate *draw_vs_get_emit( struct draw_context *draw,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    struct translate_key *key );
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_vs_variant *
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_vs_create_variant_generic( struct draw_vertex_shader *vs,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const struct draw_vs_variant_key *key );
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int draw_vs_variant_keysize( const struct draw_vs_variant_key *key )
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 2 * sizeof(int) + key->nr_elements * sizeof(struct draw_variant_element);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int draw_vs_variant_key_compare( const struct draw_vs_variant_key *a,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         const struct draw_vs_variant_key *b )
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int keysize = draw_vs_variant_keysize(a);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return memcmp(a, b, keysize);
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_TGSI_VERTICES 4
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
215