gles2_cmd_format.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Use of this source code is governed by a BSD-style license that can be
3fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt// found in the LICENSE file.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// This file defines the GLES2 command buffer commands.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <KHR/khrplatform.h>
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <string.h>
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/safe_numerics.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../common/types.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../common/bitfield_helpers.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../common/cmd_buffer_common.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../common/gles2_cmd_ids.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// GL types are forward declared to avoid including the GL headers. The problem
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// is determining which GL headers to include from code that is common to the
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// client and service sides (GLES2 or one of several GL implementations).
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef unsigned int GLenum;
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef unsigned int GLbitfield;
2661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidttypedef unsigned int GLuint;
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef int GLint;
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef int GLsizei;
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef unsigned char GLboolean;
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef signed char GLbyte;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef short GLshort;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef unsigned char GLubyte;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef unsigned short GLushort;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef unsigned long GLulong;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef float GLfloat;
361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidttypedef float GLclampf;
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef double GLdouble;
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef double GLclampd;
3904949598a23f501be6eec21697465fd46a28840aDmitry Shmidttypedef void GLvoid;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef khronos_intptr_t GLintptr;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef khronos_ssize_t  GLsizeiptr;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtnamespace gpu {
4461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtnamespace gles2 {
4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#pragma pack(push, 1)
4734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt
488da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidtnamespace id_namespaces {
49e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
5034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt// These are used when contexts share resources.
514b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidtenum IdNamespaces {
524b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt  kBuffers,
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  kFramebuffers,
5461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  kProgramsAndShaders,
5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  kRenderbuffers,
56fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt  kTextures,
5761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  kQueries,
5861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  kVertexArrays,
5961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  kNumIdNamespaces
6061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt};
61fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
6261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt// These numbers must not change
6361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtCOMPILE_ASSERT(kBuffers == 0, kBuffers_is_not_0);
6461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtCOMPILE_ASSERT(kFramebuffers == 1, kFramebuffers_is_not_1);
6561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtCOMPILE_ASSERT(kProgramsAndShaders == 2, kProgramsAndShaders_is_not_2);
6661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtCOMPILE_ASSERT(kRenderbuffers == 3, kRenderbuffers_is_not_3);
6761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtCOMPILE_ASSERT(kTextures == 4, kTextures_is_not_4);
6861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}  // namespace id_namespaces
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
71cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt// Used for some glGetXXX commands that return a result through a pointer. We
72cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt// need to know if the command succeeded or not and the size of the result. If
73cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt// the command failed its result size will 0.
74cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidttemplate <typename T>
75cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidtstruct SizedResult {
76cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt  typedef T Type;
77cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt
78cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt  T* GetData() {
79cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt    return static_cast<T*>(static_cast<void*>(&data));
80cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt  }
81cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt
82cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt  // Returns the total size in bytes of the SizedResult for a given number of
83cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt  // results including the size field.
84cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt  static size_t ComputeSize(size_t num_results) {
85cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt    return sizeof(T) * num_results + sizeof(uint32);  // NOLINT
865c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  }
875c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen
885c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  // Returns the total size in bytes of the SizedResult for a given size of
895c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  // results.
905c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  static size_t ComputeSizeFromBytes(size_t size_of_result_in_bytes) {
915c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen    return size_of_result_in_bytes + sizeof(uint32);  // NOLINT
925c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  }
935c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen
945c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  // Returns the maximum number of results for a given buffer size.
955c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  static uint32 ComputeMaxResults(size_t size_of_buffer) {
965c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen    return (size_of_buffer >= sizeof(uint32)) ?
975c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen        ((size_of_buffer - sizeof(uint32)) / sizeof(T)) : 0;  // NOLINT
985c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  }
995c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen
1005c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  // Set the size for a given number of results.
1015c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  void SetNumResults(size_t num_results) {
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    size = sizeof(T) * num_results;  // NOLINT
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Get the number of elements in the result
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  int32 GetNumResults() const {
1075c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen    return size / sizeof(T);  // NOLINT
1085c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  }
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1105c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen  // Copy the result.
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void CopyResult(void* dst) const {
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    memcpy(dst, &data, size);
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 size;  // in bytes.
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  int32 data;  // this is just here to get an offset.
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(SizedResult<int8>) == 8, SizedResult_size_not_8);
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(SizedResult<int8>, size) == 0,
12104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt               OffsetOf_SizedResult_size_not_0);
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(SizedResult<int8>, data) == 4,
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_SizedResult_data_not_4);
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The data for one attrib or uniform from GetProgramInfoCHROMIUM.
126d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstruct ProgramInput {
127d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  uint32 type;             // The type (GL_VEC3, GL_MAT3, GL_SAMPLER_2D, etc.
128d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  int32 size;              // The size (how big the array is for uniforms)
129d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  uint32 location_offset;  // offset from ProgramInfoHeader to 'size' locations
130d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt                           // for uniforms, 1 for attribs.
131d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt  uint32 name_offset;      // offset from ProgrmaInfoHeader to start of name.
13261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  uint32 name_length;      // length of the name.
13361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt};
13461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
13561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt// The format of the bucket filled out by GetProgramInfoCHROMIUM
13661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstruct ProgramInfoHeader {
13761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  uint32 link_status;
13861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  uint32 num_attribs;
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 num_uniforms;
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // ProgramInput inputs[num_attribs + num_uniforms];
1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt};
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The format of QuerySync used by EXT_occlusion_query_boolean
144a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtstruct QuerySync {
145a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt  void Reset() {
146a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt    process_count = 0;
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    result = 0;
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 process_count;
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint64 result;
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(ProgramInput) == 20, ProgramInput_size_not_20);
155cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInput, type) == 0,
1565c879ee8a1def48a71e0929d378c0912ef63bb3fJouni Malinen               OffsetOf_ProgramInput_type_not_0);
157cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInput, size) == 4,
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInput_size_not_4);
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInput, location_offset) == 8,
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInput_location_offset_not_8);
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInput, name_offset) == 12,
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInput_name_offset_not_12);
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInput, name_length) == 16,
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInput_name_length_not_16);
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(ProgramInfoHeader) == 12, ProgramInfoHeader_size_not_12);
1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInfoHeader, link_status) == 0,
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInfoHeader_link_status_not_0);
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInfoHeader, num_attribs) == 4,
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInfoHeader_num_attribs_not_4);
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(ProgramInfoHeader, num_uniforms) == 8,
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_ProgramInfoHeader_num_uniforms_not_8);
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace cmds {
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../common/gles2_cmd_format_autogen.h"
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// These are hand written commands.
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// TODO(gman): Attempt to make these auto-generated.
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct GetAttribLocation {
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GetAttribLocation ValueType;
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const CommandId kCmdId = kGetAttribLocation;
18404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
18504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GLint Result;
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static uint32 ComputeSize() {
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return static_cast<uint32>(sizeof(ValueType));  // NOLINT
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
191c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt
192c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt  void SetHeader() {
193c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt    header.SetCmd<ValueType>();
194c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt  }
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void Init(
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset,
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset,
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _data_size) {
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SetHeader();
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    program = _program;
20204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    name_shm_id = _name_shm_id;
20304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    name_shm_offset = _name_shm_offset;
20404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    location_shm_id = _location_shm_id;
205c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt    location_shm_offset = _location_shm_offset;
206c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt    data_size = _data_size;
207c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt  }
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void* Set(
210c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt      void* cmd, GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset,
211c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset,
212c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt      uint32 _data_size) {
213c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt    static_cast<ValueType*>(
214c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt        cmd)->Init(
215c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt            _program, _name_shm_id, _name_shm_offset, _location_shm_id,
216c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt            _location_shm_offset, _data_size);
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return NextCmdAddress<ValueType>(cmd);
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 program;
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 name_shm_id;
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 name_shm_offset;
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_id;
22561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  uint32 location_shm_offset;
226b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt  uint32 data_size;
22761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt};
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(GetAttribLocation) == 28,
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               Sizeof_GetAttribLocation_is_not_28);
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, header) == 0,
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_header_not_0);
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, program) == 4,
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_program_not_4);
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, name_shm_id) == 8,
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_name_shm_id_not_8);
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, name_shm_offset) == 12,
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_name_shm_offset_not_12);
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_id) == 16,
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_location_shm_id_not_16);
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_offset) == 20,
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_location_shm_offset_not_20);
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocation, data_size) == 24,
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocation_data_size_not_24);
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct GetAttribLocationImmediate {
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GetAttribLocationImmediate ValueType;
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const CommandId kCmdId = kGetAttribLocationImmediate;
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GLint Result;
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static uint32 ComputeDataSize(const char* s) {
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return base::checked_numeric_cast<uint32>(strlen(s));
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static uint32 ComputeSize(const char* s) {
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return base::checked_numeric_cast<uint32>(sizeof(ValueType) +
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                              ComputeDataSize(s));
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void SetHeader(const char* s) {
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    header.SetCmdByTotalSize<ValueType>(ComputeSize(s));
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void Init(
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      GLuint _program, const char* _name,
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SetHeader(_name);
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    program = _program;
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_id = _location_shm_id;
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_offset = _location_shm_offset;
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    data_size = ComputeDataSize(_name);
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    memcpy(ImmediateDataAddress(this), _name, data_size);
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void* Set(
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      void* cmd, GLuint _program, const char* _name,
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    uint32 total_size = ComputeSize(_name);
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static_cast<ValueType*>(
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        cmd)->Init(_program, _name, _location_shm_id, _location_shm_offset);
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return NextImmediateCmdAddressTotalSize<ValueType>(cmd, total_size);
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 program;
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_id;
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_offset;
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 data_size;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(GetAttribLocationImmediate) == 20,
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               Sizeof_GetAttribLocationImmediate_is_not_20);
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationImmediate, header) == 0,
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationImmediate_header_not_0);
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationImmediate, program) == 4,
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationImmediate_program_not_4);
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationImmediate, location_shm_id) == 8,
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationImmediate_location_shm_id_not_8);
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationImmediate, location_shm_offset) == 12,
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationImmediate_location_shm_offset_not_12);
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationImmediate, data_size) == 16,
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationImmediate_data_size_not_16);
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct GetAttribLocationBucket {
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GetAttribLocationBucket ValueType;
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const CommandId kCmdId = kGetAttribLocationBucket;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
3111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
312391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt  typedef GLint Result;
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
314df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt  static uint32 ComputeSize() {
315df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt    return static_cast<uint32>(sizeof(ValueType));  // NOLINT
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
318df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt  void SetHeader() {
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    header.SetCmd<ValueType>();
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void Init(
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      GLuint _program, uint32 _name_bucket_id,
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SetHeader();
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    program = _program;
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    name_bucket_id = _name_bucket_id;
32804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    location_shm_id = _location_shm_id;
32904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    location_shm_offset = _location_shm_offset;
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void* Set(
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      void* cmd, GLuint _program, uint32 _name_bucket_id,
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static_cast<ValueType*>(
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        cmd)->Init(
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            _program, _name_bucket_id, _location_shm_id,
33804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt            _location_shm_offset);
33904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    return NextCmdAddress<ValueType>(cmd);
34004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt  }
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 program;
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 name_bucket_id;
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_id;
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_offset;
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(GetAttribLocationBucket) == 20,
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               Sizeof_GetAttribLocationBucket_is_not_24);
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationBucket, header) == 0,
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationBucket_header_not_0);
3532271d3fdd5982d0e5e81cf9999a861bba933eacbDmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationBucket, program) == 4,
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationBucket_program_not_4);
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationBucket, name_bucket_id) == 8,
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationBucket_name_bucket_id_not_8);
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationBucket, location_shm_id) == 12,
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationBucket_location_shm_id_not_12);
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetAttribLocationBucket, location_shm_offset) == 16,
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetAttribLocationBucket_location_shm_offset_not_16);
3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct GetUniformLocation {
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GetUniformLocation ValueType;
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const CommandId kCmdId = kGetUniformLocation;
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GLint Result;
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
369b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt  static uint32 ComputeSize() {
370b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    return static_cast<uint32>(sizeof(ValueType));  // NOLINT
371b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt  }
372b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt
373b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt  void SetHeader() {
374b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    header.SetCmd<ValueType>();
375b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt  }
376b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt
377b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt  void Init(
378b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt      GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset,
379b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset,
380b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt      uint32 _data_size) {
381b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    SetHeader();
382b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    program = _program;
3839bce59c7fef20e34a05f04d1e33a4076083dca0cDmitry Shmidt    name_shm_id = _name_shm_id;
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    name_shm_offset = _name_shm_offset;
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_id = _location_shm_id;
386b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    location_shm_offset = _location_shm_offset;
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    data_size = _data_size;
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void* Set(
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      void* cmd, GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset,
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset,
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _data_size) {
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static_cast<ValueType*>(
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        cmd)->Init(
396b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt            _program, _name_shm_id, _name_shm_offset, _location_shm_id,
397b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt            _location_shm_offset, _data_size);
398b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    return NextCmdAddress<ValueType>(cmd);
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 program;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 name_shm_id;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 name_shm_offset;
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_id;
40675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  uint32 location_shm_offset;
40775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen  uint32 data_size;
40875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen};
409f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
410f21452aea786ac056eb01f1cbba4f553bd502747Dmitry ShmidtCOMPILE_ASSERT(sizeof(GetUniformLocation) == 28,
411f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt               Sizeof_GetUniformLocation_is_not_28);
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, header) == 0,
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_header_not_0);
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, program) == 4,
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_program_not_4);
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, name_shm_id) == 8,
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_name_shm_id_not_8);
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, name_shm_offset) == 12,
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_name_shm_offset_not_12);
4209bce59c7fef20e34a05f04d1e33a4076083dca0cDmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_id) == 16,
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_location_shm_id_not_16);
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_offset) == 20,
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_location_shm_offset_not_20);
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocation, data_size) == 24,
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocation_data_size_not_24);
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct GetUniformLocationImmediate {
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GetUniformLocationImmediate ValueType;
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const CommandId kCmdId = kGetUniformLocationImmediate;
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GLint Result;
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static uint32 ComputeDataSize(const char* s) {
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return base::checked_numeric_cast<uint32>(strlen(s));
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4389bce59c7fef20e34a05f04d1e33a4076083dca0cDmitry Shmidt  static uint32 ComputeSize(const char* s) {
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return base::checked_numeric_cast<uint32>(sizeof(ValueType) +
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                              ComputeDataSize(s));
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void SetHeader(const char* s) {
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    header.SetCmdByTotalSize<ValueType>(ComputeSize(s));
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void Init(
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      GLuint _program, const char* _name,
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SetHeader(_name);
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    program = _program;
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_id = _location_shm_id;
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_offset = _location_shm_offset;
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    data_size = ComputeDataSize(_name);
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    memcpy(ImmediateDataAddress(this), _name, data_size);
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void* Set(
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      void* cmd, GLuint _program, const char* _name,
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    uint32 total_size = ComputeSize(_name);
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static_cast<ValueType*>(
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        cmd)->Init(_program, _name, _location_shm_id, _location_shm_offset);
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return NextImmediateCmdAddressTotalSize<ValueType>(cmd, total_size);
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 program;
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_id;
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_offset;
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 data_size;
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(GetUniformLocationImmediate) == 20,
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               Sizeof_GetUniformLocationImmediate_is_not_20);
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationImmediate, header) == 0,
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationImmediate_header_not_0);
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationImmediate, program) == 4,
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationImmediate_program_not_4);
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationImmediate, location_shm_id) == 8,
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationImmediate_location_shm_id_not_8);
482d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry ShmidtCOMPILE_ASSERT(
483d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt    offsetof(GetUniformLocationImmediate, location_shm_offset) == 12,
484d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt               OffsetOf_GetUniformLocationImmediate_location_shm_offset_not_12);
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationImmediate, data_size) == 16,
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationImmediate_data_size_not_16);
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct GetUniformLocationBucket {
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GetUniformLocationBucket ValueType;
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const CommandId kCmdId = kGetUniformLocationBucket;
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  typedef GLint Result;
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4959bce59c7fef20e34a05f04d1e33a4076083dca0cDmitry Shmidt  static uint32 ComputeSize() {
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return static_cast<uint32>(sizeof(ValueType));  // NOLINT
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void SetHeader() {
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    header.SetCmd<ValueType>();
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void Init(
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      GLuint _program, uint32 _name_bucket_id,
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SetHeader();
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    program = _program;
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    name_bucket_id = _name_bucket_id;
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_id = _location_shm_id;
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    location_shm_offset = _location_shm_offset;
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void* Set(
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      void* cmd, GLuint _program, uint32 _name_bucket_id,
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      uint32 _location_shm_id, uint32 _location_shm_offset) {
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    static_cast<ValueType*>(
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        cmd)->Init(
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            _program, _name_bucket_id, _location_shm_id,
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt            _location_shm_offset);
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return NextCmdAddress<ValueType>(cmd);
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 program;
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 name_bucket_id;
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_id;
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  uint32 location_shm_offset;
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(sizeof(GetUniformLocationBucket) == 20,
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               Sizeof_GetUniformLocationBucket_is_not_24);
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationBucket, header) == 0,
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationBucket_header_not_0);
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationBucket, program) == 4,
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationBucket_program_not_4);
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationBucket, name_bucket_id) == 8,
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationBucket_name_bucket_id_not_8);
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationBucket, location_shm_id) == 12,
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt               OffsetOf_GetUniformLocationBucket_location_shm_id_not_12);
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCOMPILE_ASSERT(offsetof(GetUniformLocationBucket, location_shm_offset) == 16,
54161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt               OffsetOf_GetUniformLocationBucket_location_shm_offset_not_16);
54261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
54361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstruct InsertSyncPointCHROMIUM {
54461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  typedef InsertSyncPointCHROMIUM ValueType;
54561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  static const CommandId kCmdId = kInsertSyncPointCHROMIUM;
54661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  CommandHeader header;
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(pop)
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}  // namespace cmd
553f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt}  // namespace gles2
554f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt}  // namespace gpu
555f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
556f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt#endif  // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_
557f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt