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