910e62b5创建于 1月15日历史提交
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file is auto-generated from
// gpu/command_buffer/build_gles2_cmd_buffer.py
// It's formatted by clang-format using chromium coding style:
//    clang-format -i -style=chromium filename
// DO NOT EDIT!

#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
#pragma allow_unsafe_buffers
#endif

// It is included by context_state.cc
#ifndef GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_IMPL_AUTOGEN_H_
#define GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_IMPL_AUTOGEN_H_

ContextState::EnableFlags::EnableFlags()
    : blend(false),
      cached_blend(false),
      cull_face(false),
      cached_cull_face(false),
      depth_test(false),
      cached_depth_test(false),
      dither(true),
      cached_dither(true),
      framebuffer_srgb_ext(true),
      cached_framebuffer_srgb_ext(true),
      polygon_offset_fill(false),
      cached_polygon_offset_fill(false),
      sample_alpha_to_coverage(false),
      cached_sample_alpha_to_coverage(false),
      sample_coverage(false),
      cached_sample_coverage(false),
      scissor_test(false),
      cached_scissor_test(false),
      stencil_test(false),
      cached_stencil_test(false),
      rasterizer_discard(false),
      cached_rasterizer_discard(false),
      primitive_restart_fixed_index(false),
      cached_primitive_restart_fixed_index(false),
      multisample_ext(true),
      cached_multisample_ext(true),
      sample_alpha_to_one_ext(false),
      cached_sample_alpha_to_one_ext(false) {}

void ContextState::Initialize() {
  blend_color_red = 0.0f;
  blend_color_green = 0.0f;
  blend_color_blue = 0.0f;
  blend_color_alpha = 0.0f;
  blend_equation_rgb = GL_FUNC_ADD;
  blend_equation_alpha = GL_FUNC_ADD;
  blend_source_rgb = GL_ONE;
  blend_dest_rgb = GL_ZERO;
  blend_source_alpha = GL_ONE;
  blend_dest_alpha = GL_ZERO;
  color_clear_red = 0.0f;
  color_clear_green = 0.0f;
  color_clear_blue = 0.0f;
  color_clear_alpha = 0.0f;
  depth_clear = 1.0f;
  stencil_clear = 0;
  color_mask_red = true;
  cached_color_mask_red = true;
  color_mask_green = true;
  cached_color_mask_green = true;
  color_mask_blue = true;
  cached_color_mask_blue = true;
  color_mask_alpha = true;
  cached_color_mask_alpha = true;
  cull_mode = GL_BACK;
  depth_func = GL_LESS;
  depth_mask = true;
  cached_depth_mask = true;
  z_near = 0.0f;
  z_far = 1.0f;
  front_face = GL_CCW;
  hint_generate_mipmap = GL_DONT_CARE;
  hint_fragment_shader_derivative = GL_DONT_CARE;
  line_width = 1.0f;
  pack_alignment = 4;
  unpack_alignment = 4;
  pack_row_length = 0;
  pack_skip_pixels = 0;
  pack_skip_rows = 0;
  unpack_row_length = 0;
  unpack_image_height = 0;
  unpack_skip_pixels = 0;
  unpack_skip_rows = 0;
  unpack_skip_images = 0;
  polygon_offset_factor = 0.0f;
  polygon_offset_units = 0.0f;
  sample_coverage_value = 1.0f;
  sample_coverage_invert = false;
  scissor_x = 0;
  scissor_y = 0;
  scissor_width = 1;
  scissor_height = 1;
  stencil_front_func = GL_ALWAYS;
  stencil_front_ref = 0;
  stencil_front_mask = 0xFFFFFFFFU;
  stencil_back_func = GL_ALWAYS;
  stencil_back_ref = 0;
  stencil_back_mask = 0xFFFFFFFFU;
  stencil_front_writemask = 0xFFFFFFFFU;
  cached_stencil_front_writemask = 0xFFFFFFFFU;
  stencil_back_writemask = 0xFFFFFFFFU;
  cached_stencil_back_writemask = 0xFFFFFFFFU;
  stencil_front_fail_op = GL_KEEP;
  stencil_front_z_fail_op = GL_KEEP;
  stencil_front_z_pass_op = GL_KEEP;
  stencil_back_fail_op = GL_KEEP;
  stencil_back_z_fail_op = GL_KEEP;
  stencil_back_z_pass_op = GL_KEEP;
  viewport_x = 0;
  viewport_y = 0;
  viewport_width = 1;
  viewport_height = 1;
  window_rectangles_mode = GL_EXCLUSIVE_EXT;
  num_window_rectangles = 0;
}

void ContextState::InitCapabilities(const ContextState* prev_state) const {
  if (prev_state) {
    if (prev_state->enable_flags.cached_blend != enable_flags.cached_blend) {
      EnableDisable(GL_BLEND, enable_flags.cached_blend);
    }
    if (prev_state->enable_flags.cached_cull_face !=
        enable_flags.cached_cull_face) {
      EnableDisable(GL_CULL_FACE, enable_flags.cached_cull_face);
    }
    if (prev_state->enable_flags.cached_depth_test !=
        enable_flags.cached_depth_test) {
      EnableDisable(GL_DEPTH_TEST, enable_flags.cached_depth_test);
    }
    if (prev_state->enable_flags.cached_dither != enable_flags.cached_dither) {
      EnableDisable(GL_DITHER, enable_flags.cached_dither);
    }
    if (prev_state->enable_flags.cached_polygon_offset_fill !=
        enable_flags.cached_polygon_offset_fill) {
      EnableDisable(GL_POLYGON_OFFSET_FILL,
                    enable_flags.cached_polygon_offset_fill);
    }
    if (prev_state->enable_flags.cached_sample_alpha_to_coverage !=
        enable_flags.cached_sample_alpha_to_coverage) {
      EnableDisable(GL_SAMPLE_ALPHA_TO_COVERAGE,
                    enable_flags.cached_sample_alpha_to_coverage);
    }
    if (prev_state->enable_flags.cached_sample_coverage !=
        enable_flags.cached_sample_coverage) {
      EnableDisable(GL_SAMPLE_COVERAGE, enable_flags.cached_sample_coverage);
    }
    if (prev_state->enable_flags.cached_scissor_test !=
        enable_flags.cached_scissor_test) {
      EnableDisable(GL_SCISSOR_TEST, enable_flags.cached_scissor_test);
    }
    if (prev_state->enable_flags.cached_stencil_test !=
        enable_flags.cached_stencil_test) {
      EnableDisable(GL_STENCIL_TEST, enable_flags.cached_stencil_test);
    }
    if (feature_info_->feature_flags().ext_multisample_compatibility) {
      if (prev_state->enable_flags.cached_multisample_ext !=
          enable_flags.cached_multisample_ext) {
        EnableDisable(GL_MULTISAMPLE_EXT, enable_flags.cached_multisample_ext);
      }
    }
    if (feature_info_->feature_flags().ext_multisample_compatibility) {
      if (prev_state->enable_flags.cached_sample_alpha_to_one_ext !=
          enable_flags.cached_sample_alpha_to_one_ext) {
        EnableDisable(GL_SAMPLE_ALPHA_TO_ONE_EXT,
                      enable_flags.cached_sample_alpha_to_one_ext);
      }
    }
    if (feature_info_->IsES3Capable()) {
      if (prev_state->enable_flags.cached_rasterizer_discard !=
          enable_flags.cached_rasterizer_discard) {
        EnableDisable(GL_RASTERIZER_DISCARD,
                      enable_flags.cached_rasterizer_discard);
      }
      if (prev_state->enable_flags.cached_primitive_restart_fixed_index !=
          enable_flags.cached_primitive_restart_fixed_index) {
        EnableDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX,
                      enable_flags.cached_primitive_restart_fixed_index);
      }
    }
  } else {
    EnableDisable(GL_BLEND, enable_flags.cached_blend);
    EnableDisable(GL_CULL_FACE, enable_flags.cached_cull_face);
    EnableDisable(GL_DEPTH_TEST, enable_flags.cached_depth_test);
    EnableDisable(GL_DITHER, enable_flags.cached_dither);
    EnableDisable(GL_POLYGON_OFFSET_FILL,
                  enable_flags.cached_polygon_offset_fill);
    EnableDisable(GL_SAMPLE_ALPHA_TO_COVERAGE,
                  enable_flags.cached_sample_alpha_to_coverage);
    EnableDisable(GL_SAMPLE_COVERAGE, enable_flags.cached_sample_coverage);
    EnableDisable(GL_SCISSOR_TEST, enable_flags.cached_scissor_test);
    EnableDisable(GL_STENCIL_TEST, enable_flags.cached_stencil_test);
    if (feature_info_->feature_flags().ext_multisample_compatibility) {
      EnableDisable(GL_MULTISAMPLE_EXT, enable_flags.cached_multisample_ext);
    }
    if (feature_info_->feature_flags().ext_multisample_compatibility) {
      EnableDisable(GL_SAMPLE_ALPHA_TO_ONE_EXT,
                    enable_flags.cached_sample_alpha_to_one_ext);
    }
    if (feature_info_->IsES3Capable()) {
      EnableDisable(GL_RASTERIZER_DISCARD,
                    enable_flags.cached_rasterizer_discard);
      EnableDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX,
                    enable_flags.cached_primitive_restart_fixed_index);
    }
  }
}

void ContextState::InitState(const ContextState* prev_state) const {
  if (prev_state) {
    if ((blend_color_red != prev_state->blend_color_red) ||
        (blend_color_green != prev_state->blend_color_green) ||
        (blend_color_blue != prev_state->blend_color_blue) ||
        (blend_color_alpha != prev_state->blend_color_alpha))
      api()->glBlendColorFn(blend_color_red, blend_color_green,
                            blend_color_blue, blend_color_alpha);
    if ((blend_equation_rgb != prev_state->blend_equation_rgb) ||
        (blend_equation_alpha != prev_state->blend_equation_alpha))
      api()->glBlendEquationSeparateFn(blend_equation_rgb,
                                       blend_equation_alpha);
    if ((blend_source_rgb != prev_state->blend_source_rgb) ||
        (blend_dest_rgb != prev_state->blend_dest_rgb) ||
        (blend_source_alpha != prev_state->blend_source_alpha) ||
        (blend_dest_alpha != prev_state->blend_dest_alpha))
      api()->glBlendFuncSeparateFn(blend_source_rgb, blend_dest_rgb,
                                   blend_source_alpha, blend_dest_alpha);
    if ((color_clear_red != prev_state->color_clear_red) ||
        (color_clear_green != prev_state->color_clear_green) ||
        (color_clear_blue != prev_state->color_clear_blue) ||
        (color_clear_alpha != prev_state->color_clear_alpha))
      api()->glClearColorFn(color_clear_red, color_clear_green,
                            color_clear_blue, color_clear_alpha);
    if ((depth_clear != prev_state->depth_clear))
      api()->glClearDepthFn(depth_clear);
    if ((stencil_clear != prev_state->stencil_clear))
      api()->glClearStencilFn(stencil_clear);
    if ((cached_color_mask_red != prev_state->cached_color_mask_red) ||
        (cached_color_mask_green != prev_state->cached_color_mask_green) ||
        (cached_color_mask_blue != prev_state->cached_color_mask_blue) ||
        (cached_color_mask_alpha != prev_state->cached_color_mask_alpha))
      api()->glColorMaskFn(cached_color_mask_red, cached_color_mask_green,
                           cached_color_mask_blue, cached_color_mask_alpha);
    if ((cull_mode != prev_state->cull_mode))
      api()->glCullFaceFn(cull_mode);
    if ((depth_func != prev_state->depth_func))
      api()->glDepthFuncFn(depth_func);
    if ((cached_depth_mask != prev_state->cached_depth_mask))
      api()->glDepthMaskFn(cached_depth_mask);
    if ((z_near != prev_state->z_near) || (z_far != prev_state->z_far))
      api()->glDepthRangeFn(z_near, z_far);
    if ((front_face != prev_state->front_face))
      api()->glFrontFaceFn(front_face);
    if (prev_state->hint_generate_mipmap != hint_generate_mipmap) {
      api()->glHintFn(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap);
    }
    if (feature_info_->feature_flags().oes_standard_derivatives) {
      if (prev_state->hint_fragment_shader_derivative !=
          hint_fragment_shader_derivative) {
        api()->glHintFn(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES,
                        hint_fragment_shader_derivative);
      }
    }
    if ((line_width != prev_state->line_width))
      DoLineWidth(line_width);
    if (prev_state->pack_alignment != pack_alignment) {
      api()->glPixelStoreiFn(GL_PACK_ALIGNMENT, pack_alignment);
    }
    if (prev_state->unpack_alignment != unpack_alignment) {
      api()->glPixelStoreiFn(GL_UNPACK_ALIGNMENT, unpack_alignment);
    }
    if ((polygon_offset_factor != prev_state->polygon_offset_factor) ||
        (polygon_offset_units != prev_state->polygon_offset_units))
      api()->glPolygonOffsetFn(polygon_offset_factor, polygon_offset_units);
    if ((sample_coverage_value != prev_state->sample_coverage_value) ||
        (sample_coverage_invert != prev_state->sample_coverage_invert))
      api()->glSampleCoverageFn(sample_coverage_value, sample_coverage_invert);
    if ((scissor_x != prev_state->scissor_x) ||
        (scissor_y != prev_state->scissor_y) ||
        (scissor_width != prev_state->scissor_width) ||
        (scissor_height != prev_state->scissor_height))
      api()->glScissorFn(scissor_x, scissor_y, scissor_width, scissor_height);
    if ((stencil_front_func != prev_state->stencil_front_func) ||
        (stencil_front_ref != prev_state->stencil_front_ref) ||
        (stencil_front_mask != prev_state->stencil_front_mask))
      api()->glStencilFuncSeparateFn(GL_FRONT, stencil_front_func,
                                     stencil_front_ref, stencil_front_mask);
    if ((stencil_back_func != prev_state->stencil_back_func) ||
        (stencil_back_ref != prev_state->stencil_back_ref) ||
        (stencil_back_mask != prev_state->stencil_back_mask))
      api()->glStencilFuncSeparateFn(GL_BACK, stencil_back_func,
                                     stencil_back_ref, stencil_back_mask);
    if ((cached_stencil_front_writemask !=
         prev_state->cached_stencil_front_writemask))
      api()->glStencilMaskSeparateFn(GL_FRONT, cached_stencil_front_writemask);
    if ((cached_stencil_back_writemask !=
         prev_state->cached_stencil_back_writemask))
      api()->glStencilMaskSeparateFn(GL_BACK, cached_stencil_back_writemask);
    if ((stencil_front_fail_op != prev_state->stencil_front_fail_op) ||
        (stencil_front_z_fail_op != prev_state->stencil_front_z_fail_op) ||
        (stencil_front_z_pass_op != prev_state->stencil_front_z_pass_op))
      api()->glStencilOpSeparateFn(GL_FRONT, stencil_front_fail_op,
                                   stencil_front_z_fail_op,
                                   stencil_front_z_pass_op);
    if ((stencil_back_fail_op != prev_state->stencil_back_fail_op) ||
        (stencil_back_z_fail_op != prev_state->stencil_back_z_fail_op) ||
        (stencil_back_z_pass_op != prev_state->stencil_back_z_pass_op))
      api()->glStencilOpSeparateFn(GL_BACK, stencil_back_fail_op,
                                   stencil_back_z_fail_op,
                                   stencil_back_z_pass_op);
    if ((viewport_x != prev_state->viewport_x) ||
        (viewport_y != prev_state->viewport_y) ||
        (viewport_width != prev_state->viewport_width) ||
        (viewport_height != prev_state->viewport_height))
      api()->glViewportFn(viewport_x, viewport_y, viewport_width,
                          viewport_height);
  } else {
    api()->glBlendColorFn(blend_color_red, blend_color_green, blend_color_blue,
                          blend_color_alpha);
    api()->glBlendEquationSeparateFn(blend_equation_rgb, blend_equation_alpha);
    api()->glBlendFuncSeparateFn(blend_source_rgb, blend_dest_rgb,
                                 blend_source_alpha, blend_dest_alpha);
    api()->glClearColorFn(color_clear_red, color_clear_green, color_clear_blue,
                          color_clear_alpha);
    api()->glClearDepthFn(depth_clear);
    api()->glClearStencilFn(stencil_clear);
    api()->glColorMaskFn(cached_color_mask_red, cached_color_mask_green,
                         cached_color_mask_blue, cached_color_mask_alpha);
    api()->glCullFaceFn(cull_mode);
    api()->glDepthFuncFn(depth_func);
    api()->glDepthMaskFn(cached_depth_mask);
    api()->glDepthRangeFn(z_near, z_far);
    api()->glFrontFaceFn(front_face);
    api()->glHintFn(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap);
    if (feature_info_->feature_flags().oes_standard_derivatives) {
      api()->glHintFn(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES,
                      hint_fragment_shader_derivative);
    }
    DoLineWidth(line_width);
    api()->glPixelStoreiFn(GL_PACK_ALIGNMENT, pack_alignment);
    api()->glPixelStoreiFn(GL_UNPACK_ALIGNMENT, unpack_alignment);
    api()->glPolygonOffsetFn(polygon_offset_factor, polygon_offset_units);
    api()->glSampleCoverageFn(sample_coverage_value, sample_coverage_invert);
    api()->glScissorFn(scissor_x, scissor_y, scissor_width, scissor_height);
    api()->glStencilFuncSeparateFn(GL_FRONT, stencil_front_func,
                                   stencil_front_ref, stencil_front_mask);
    api()->glStencilFuncSeparateFn(GL_BACK, stencil_back_func, stencil_back_ref,
                                   stencil_back_mask);
    api()->glStencilMaskSeparateFn(GL_FRONT, cached_stencil_front_writemask);
    api()->glStencilMaskSeparateFn(GL_BACK, cached_stencil_back_writemask);
    api()->glStencilOpSeparateFn(GL_FRONT, stencil_front_fail_op,
                                 stencil_front_z_fail_op,
                                 stencil_front_z_pass_op);
    api()->glStencilOpSeparateFn(GL_BACK, stencil_back_fail_op,
                                 stencil_back_z_fail_op,
                                 stencil_back_z_pass_op);
    api()->glViewportFn(viewport_x, viewport_y, viewport_width,
                        viewport_height);
  }
  InitStateManual(prev_state);
}
bool ContextState::GetEnabled(GLenum cap) const {
  switch (cap) {
    case GL_BLEND:
      return enable_flags.blend;
    case GL_CULL_FACE:
      return enable_flags.cull_face;
    case GL_DEPTH_TEST:
      return enable_flags.depth_test;
    case GL_DITHER:
      return enable_flags.dither;
    case GL_FRAMEBUFFER_SRGB_EXT:
      return enable_flags.framebuffer_srgb_ext;
    case GL_POLYGON_OFFSET_FILL:
      return enable_flags.polygon_offset_fill;
    case GL_SAMPLE_ALPHA_TO_COVERAGE:
      return enable_flags.sample_alpha_to_coverage;
    case GL_SAMPLE_COVERAGE:
      return enable_flags.sample_coverage;
    case GL_SCISSOR_TEST:
      return enable_flags.scissor_test;
    case GL_STENCIL_TEST:
      return enable_flags.stencil_test;
    case GL_RASTERIZER_DISCARD:
      return enable_flags.rasterizer_discard;
    case GL_PRIMITIVE_RESTART_FIXED_INDEX:
      return enable_flags.primitive_restart_fixed_index;
    case GL_MULTISAMPLE_EXT:
      return enable_flags.multisample_ext;
    case GL_SAMPLE_ALPHA_TO_ONE_EXT:
      return enable_flags.sample_alpha_to_one_ext;
    default:
      NOTREACHED();
  }
}

bool ContextState::GetStateAsGLint(GLenum pname,
                                   GLint* params,
                                   GLsizei* num_written) const {
  switch (pname) {
    case GL_BLEND_COLOR:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLint>(blend_color_red);
        params[1] = static_cast<GLint>(blend_color_green);
        params[2] = static_cast<GLint>(blend_color_blue);
        params[3] = static_cast<GLint>(blend_color_alpha);
      }
      return true;
    case GL_BLEND_EQUATION_RGB:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(blend_equation_rgb);
      }
      return true;
    case GL_BLEND_EQUATION_ALPHA:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(blend_equation_alpha);
      }
      return true;
    case GL_BLEND_SRC_RGB:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(blend_source_rgb);
      }
      return true;
    case GL_BLEND_DST_RGB:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(blend_dest_rgb);
      }
      return true;
    case GL_BLEND_SRC_ALPHA:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(blend_source_alpha);
      }
      return true;
    case GL_BLEND_DST_ALPHA:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(blend_dest_alpha);
      }
      return true;
    case GL_COLOR_CLEAR_VALUE:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLint>(color_clear_red);
        params[1] = static_cast<GLint>(color_clear_green);
        params[2] = static_cast<GLint>(color_clear_blue);
        params[3] = static_cast<GLint>(color_clear_alpha);
      }
      return true;
    case GL_DEPTH_CLEAR_VALUE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(depth_clear);
      }
      return true;
    case GL_STENCIL_CLEAR_VALUE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_clear);
      }
      return true;
    case GL_COLOR_WRITEMASK:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLint>(color_mask_red);
        params[1] = static_cast<GLint>(color_mask_green);
        params[2] = static_cast<GLint>(color_mask_blue);
        params[3] = static_cast<GLint>(color_mask_alpha);
      }
      return true;
    case GL_CULL_FACE_MODE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(cull_mode);
      }
      return true;
    case GL_DEPTH_FUNC:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(depth_func);
      }
      return true;
    case GL_DEPTH_WRITEMASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(depth_mask);
      }
      return true;
    case GL_DEPTH_RANGE:
      *num_written = 2;
      if (params) {
        params[0] = static_cast<GLint>(z_near);
        params[1] = static_cast<GLint>(z_far);
      }
      return true;
    case GL_FRONT_FACE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(front_face);
      }
      return true;
    case GL_GENERATE_MIPMAP_HINT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(hint_generate_mipmap);
      }
      return true;
    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(hint_fragment_shader_derivative);
      }
      return true;
    case GL_LINE_WIDTH:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(line_width);
      }
      return true;
    case GL_PACK_ALIGNMENT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(pack_alignment);
      }
      return true;
    case GL_UNPACK_ALIGNMENT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(unpack_alignment);
      }
      return true;
    case GL_PACK_ROW_LENGTH:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(pack_row_length);
      }
      return true;
    case GL_PACK_SKIP_PIXELS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(pack_skip_pixels);
      }
      return true;
    case GL_PACK_SKIP_ROWS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(pack_skip_rows);
      }
      return true;
    case GL_UNPACK_ROW_LENGTH:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(unpack_row_length);
      }
      return true;
    case GL_UNPACK_IMAGE_HEIGHT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(unpack_image_height);
      }
      return true;
    case GL_UNPACK_SKIP_PIXELS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(unpack_skip_pixels);
      }
      return true;
    case GL_UNPACK_SKIP_ROWS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(unpack_skip_rows);
      }
      return true;
    case GL_UNPACK_SKIP_IMAGES:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(unpack_skip_images);
      }
      return true;
    case GL_POLYGON_OFFSET_FACTOR:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(round(polygon_offset_factor));
      }
      return true;
    case GL_POLYGON_OFFSET_UNITS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(round(polygon_offset_units));
      }
      return true;
    case GL_SAMPLE_COVERAGE_VALUE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(sample_coverage_value);
      }
      return true;
    case GL_SAMPLE_COVERAGE_INVERT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(sample_coverage_invert);
      }
      return true;
    case GL_SCISSOR_BOX:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLint>(scissor_x);
        params[1] = static_cast<GLint>(scissor_y);
        params[2] = static_cast<GLint>(scissor_width);
        params[3] = static_cast<GLint>(scissor_height);
      }
      return true;
    case GL_STENCIL_FUNC:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_func);
      }
      return true;
    case GL_STENCIL_REF:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_ref);
      }
      return true;
    case GL_STENCIL_VALUE_MASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_mask);
      }
      return true;
    case GL_STENCIL_BACK_FUNC:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_func);
      }
      return true;
    case GL_STENCIL_BACK_REF:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_ref);
      }
      return true;
    case GL_STENCIL_BACK_VALUE_MASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_mask);
      }
      return true;
    case GL_STENCIL_WRITEMASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_writemask);
      }
      return true;
    case GL_STENCIL_BACK_WRITEMASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_writemask);
      }
      return true;
    case GL_STENCIL_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_fail_op);
      }
      return true;
    case GL_STENCIL_PASS_DEPTH_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_z_fail_op);
      }
      return true;
    case GL_STENCIL_PASS_DEPTH_PASS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_front_z_pass_op);
      }
      return true;
    case GL_STENCIL_BACK_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_fail_op);
      }
      return true;
    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_z_fail_op);
      }
      return true;
    case GL_STENCIL_BACK_PASS_DEPTH_PASS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(stencil_back_z_pass_op);
      }
      return true;
    case GL_VIEWPORT:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLint>(viewport_x);
        params[1] = static_cast<GLint>(viewport_y);
        params[2] = static_cast<GLint>(viewport_width);
        params[3] = static_cast<GLint>(viewport_height);
      }
      return true;
    case GL_WINDOW_RECTANGLE_MODE_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(window_rectangles_mode);
      }
      return true;
    case GL_NUM_WINDOW_RECTANGLES_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(num_window_rectangles);
      }
      return true;
    case GL_BLEND:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.blend);
      }
      return true;
    case GL_CULL_FACE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.cull_face);
      }
      return true;
    case GL_DEPTH_TEST:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.depth_test);
      }
      return true;
    case GL_DITHER:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.dither);
      }
      return true;
    case GL_FRAMEBUFFER_SRGB_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.framebuffer_srgb_ext);
      }
      return true;
    case GL_POLYGON_OFFSET_FILL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.polygon_offset_fill);
      }
      return true;
    case GL_SAMPLE_ALPHA_TO_COVERAGE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.sample_alpha_to_coverage);
      }
      return true;
    case GL_SAMPLE_COVERAGE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.sample_coverage);
      }
      return true;
    case GL_SCISSOR_TEST:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.scissor_test);
      }
      return true;
    case GL_STENCIL_TEST:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.stencil_test);
      }
      return true;
    case GL_RASTERIZER_DISCARD:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.rasterizer_discard);
      }
      return true;
    case GL_PRIMITIVE_RESTART_FIXED_INDEX:
      *num_written = 1;
      if (params) {
        params[0] =
            static_cast<GLint>(enable_flags.primitive_restart_fixed_index);
      }
      return true;
    case GL_MULTISAMPLE_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.multisample_ext);
      }
      return true;
    case GL_SAMPLE_ALPHA_TO_ONE_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLint>(enable_flags.sample_alpha_to_one_ext);
      }
      return true;
    default:
      return false;
  }
}

bool ContextState::GetStateAsGLfloat(GLenum pname,
                                     GLfloat* params,
                                     GLsizei* num_written) const {
  switch (pname) {
    case GL_BLEND_COLOR:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_color_red);
        params[1] = static_cast<GLfloat>(blend_color_green);
        params[2] = static_cast<GLfloat>(blend_color_blue);
        params[3] = static_cast<GLfloat>(blend_color_alpha);
      }
      return true;
    case GL_BLEND_EQUATION_RGB:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_equation_rgb);
      }
      return true;
    case GL_BLEND_EQUATION_ALPHA:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_equation_alpha);
      }
      return true;
    case GL_BLEND_SRC_RGB:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_source_rgb);
      }
      return true;
    case GL_BLEND_DST_RGB:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_dest_rgb);
      }
      return true;
    case GL_BLEND_SRC_ALPHA:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_source_alpha);
      }
      return true;
    case GL_BLEND_DST_ALPHA:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(blend_dest_alpha);
      }
      return true;
    case GL_COLOR_CLEAR_VALUE:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLfloat>(color_clear_red);
        params[1] = static_cast<GLfloat>(color_clear_green);
        params[2] = static_cast<GLfloat>(color_clear_blue);
        params[3] = static_cast<GLfloat>(color_clear_alpha);
      }
      return true;
    case GL_DEPTH_CLEAR_VALUE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(depth_clear);
      }
      return true;
    case GL_STENCIL_CLEAR_VALUE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_clear);
      }
      return true;
    case GL_COLOR_WRITEMASK:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLfloat>(color_mask_red);
        params[1] = static_cast<GLfloat>(color_mask_green);
        params[2] = static_cast<GLfloat>(color_mask_blue);
        params[3] = static_cast<GLfloat>(color_mask_alpha);
      }
      return true;
    case GL_CULL_FACE_MODE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(cull_mode);
      }
      return true;
    case GL_DEPTH_FUNC:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(depth_func);
      }
      return true;
    case GL_DEPTH_WRITEMASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(depth_mask);
      }
      return true;
    case GL_DEPTH_RANGE:
      *num_written = 2;
      if (params) {
        params[0] = static_cast<GLfloat>(z_near);
        params[1] = static_cast<GLfloat>(z_far);
      }
      return true;
    case GL_FRONT_FACE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(front_face);
      }
      return true;
    case GL_GENERATE_MIPMAP_HINT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(hint_generate_mipmap);
      }
      return true;
    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(hint_fragment_shader_derivative);
      }
      return true;
    case GL_LINE_WIDTH:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(line_width);
      }
      return true;
    case GL_PACK_ALIGNMENT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(pack_alignment);
      }
      return true;
    case GL_UNPACK_ALIGNMENT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(unpack_alignment);
      }
      return true;
    case GL_PACK_ROW_LENGTH:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(pack_row_length);
      }
      return true;
    case GL_PACK_SKIP_PIXELS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(pack_skip_pixels);
      }
      return true;
    case GL_PACK_SKIP_ROWS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(pack_skip_rows);
      }
      return true;
    case GL_UNPACK_ROW_LENGTH:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(unpack_row_length);
      }
      return true;
    case GL_UNPACK_IMAGE_HEIGHT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(unpack_image_height);
      }
      return true;
    case GL_UNPACK_SKIP_PIXELS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(unpack_skip_pixels);
      }
      return true;
    case GL_UNPACK_SKIP_ROWS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(unpack_skip_rows);
      }
      return true;
    case GL_UNPACK_SKIP_IMAGES:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(unpack_skip_images);
      }
      return true;
    case GL_POLYGON_OFFSET_FACTOR:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(polygon_offset_factor);
      }
      return true;
    case GL_POLYGON_OFFSET_UNITS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(polygon_offset_units);
      }
      return true;
    case GL_SAMPLE_COVERAGE_VALUE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(sample_coverage_value);
      }
      return true;
    case GL_SAMPLE_COVERAGE_INVERT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(sample_coverage_invert);
      }
      return true;
    case GL_SCISSOR_BOX:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLfloat>(scissor_x);
        params[1] = static_cast<GLfloat>(scissor_y);
        params[2] = static_cast<GLfloat>(scissor_width);
        params[3] = static_cast<GLfloat>(scissor_height);
      }
      return true;
    case GL_STENCIL_FUNC:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_func);
      }
      return true;
    case GL_STENCIL_REF:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_ref);
      }
      return true;
    case GL_STENCIL_VALUE_MASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_mask);
      }
      return true;
    case GL_STENCIL_BACK_FUNC:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_func);
      }
      return true;
    case GL_STENCIL_BACK_REF:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_ref);
      }
      return true;
    case GL_STENCIL_BACK_VALUE_MASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_mask);
      }
      return true;
    case GL_STENCIL_WRITEMASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_writemask);
      }
      return true;
    case GL_STENCIL_BACK_WRITEMASK:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_writemask);
      }
      return true;
    case GL_STENCIL_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_fail_op);
      }
      return true;
    case GL_STENCIL_PASS_DEPTH_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_z_fail_op);
      }
      return true;
    case GL_STENCIL_PASS_DEPTH_PASS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_front_z_pass_op);
      }
      return true;
    case GL_STENCIL_BACK_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_fail_op);
      }
      return true;
    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_z_fail_op);
      }
      return true;
    case GL_STENCIL_BACK_PASS_DEPTH_PASS:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(stencil_back_z_pass_op);
      }
      return true;
    case GL_VIEWPORT:
      *num_written = 4;
      if (params) {
        params[0] = static_cast<GLfloat>(viewport_x);
        params[1] = static_cast<GLfloat>(viewport_y);
        params[2] = static_cast<GLfloat>(viewport_width);
        params[3] = static_cast<GLfloat>(viewport_height);
      }
      return true;
    case GL_WINDOW_RECTANGLE_MODE_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(window_rectangles_mode);
      }
      return true;
    case GL_NUM_WINDOW_RECTANGLES_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(num_window_rectangles);
      }
      return true;
    case GL_BLEND:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.blend);
      }
      return true;
    case GL_CULL_FACE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.cull_face);
      }
      return true;
    case GL_DEPTH_TEST:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.depth_test);
      }
      return true;
    case GL_DITHER:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.dither);
      }
      return true;
    case GL_FRAMEBUFFER_SRGB_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.framebuffer_srgb_ext);
      }
      return true;
    case GL_POLYGON_OFFSET_FILL:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.polygon_offset_fill);
      }
      return true;
    case GL_SAMPLE_ALPHA_TO_COVERAGE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.sample_alpha_to_coverage);
      }
      return true;
    case GL_SAMPLE_COVERAGE:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.sample_coverage);
      }
      return true;
    case GL_SCISSOR_TEST:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.scissor_test);
      }
      return true;
    case GL_STENCIL_TEST:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.stencil_test);
      }
      return true;
    case GL_RASTERIZER_DISCARD:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.rasterizer_discard);
      }
      return true;
    case GL_PRIMITIVE_RESTART_FIXED_INDEX:
      *num_written = 1;
      if (params) {
        params[0] =
            static_cast<GLfloat>(enable_flags.primitive_restart_fixed_index);
      }
      return true;
    case GL_MULTISAMPLE_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.multisample_ext);
      }
      return true;
    case GL_SAMPLE_ALPHA_TO_ONE_EXT:
      *num_written = 1;
      if (params) {
        params[0] = static_cast<GLfloat>(enable_flags.sample_alpha_to_one_ext);
      }
      return true;
    default:
      return false;
  }
}
#endif  // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_IMPL_AUTOGEN_H_