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