15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines the GLES2 command buffer commands.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <KHR/khrplatform.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdint.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/atomicops.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/macros.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/bitfield_helpers.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/cmd_buffer_common.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_ids.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GL types are forward declared to avoid including the GL headers. The problem
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is determining which GL headers to include from code that is common to the
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client and service sides (GLES2 or one of several GL implementations).
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned int GLenum;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned int GLbitfield;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned int GLuint;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int GLint;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int GLsizei;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned char GLboolean;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef signed char GLbyte;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef short GLshort;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned char GLubyte;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned short GLushort;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long GLulong;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef float GLfloat;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef float GLclampf;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef double GLdouble;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef double GLclampd;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void GLvoid;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef khronos_intptr_t GLintptr;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef khronos_ssize_t  GLsizeiptr;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned.
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#pragma pack(push, GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace id_namespaces {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are used when contexts share resources.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum IdNamespaces {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kBuffers,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFramebuffers,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProgramsAndShaders,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kRenderbuffers,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTextures,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kQueries,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kVertexArrays,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNumIdNamespaces
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These numbers must not change
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(kBuffers == 0, kBuffers_is_not_0);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(kFramebuffers == 1, kFramebuffers_is_not_1);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(kProgramsAndShaders == 2, kProgramsAndShaders_is_not_2);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(kRenderbuffers == 3, kRenderbuffers_is_not_3);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(kTextures == 4, kTextures_is_not_4);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace id_namespaces
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for some glGetXXX commands that return a result through a pointer. We
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need to know if the command succeeded or not and the size of the result. If
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the command failed its result size will 0.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T>
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SizedResult {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef T Type;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T* GetData() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<T*>(static_cast<void*>(&data));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the total size in bytes of the SizedResult for a given number of
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results including the size field.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static size_t ComputeSize(size_t num_results) {
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return sizeof(T) * num_results + sizeof(uint32_t);  // NOLINT
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the total size in bytes of the SizedResult for a given size of
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static size_t ComputeSizeFromBytes(size_t size_of_result_in_bytes) {
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return size_of_result_in_bytes + sizeof(uint32_t);  // NOLINT
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum number of results for a given buffer size.
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static uint32_t ComputeMaxResults(size_t size_of_buffer) {
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return (size_of_buffer >= sizeof(uint32_t)) ?
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ((size_of_buffer - sizeof(uint32_t)) / sizeof(T)) : 0;  // NOLINT
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the size for a given number of results.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetNumResults(size_t num_results) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = sizeof(T) * num_results;  // NOLINT
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the number of elements in the result
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int32_t GetNumResults() const {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size / sizeof(T);  // NOLINT
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy the result.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CopyResult(void* dst) const {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(dst, &data, size);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t size;  // in bytes.
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int32_t data;  // this is just here to get an offset.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)COMPILE_ASSERT(sizeof(SizedResult<int8_t>) == 8, SizedResult_size_not_8);
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)COMPILE_ASSERT(offsetof(SizedResult<int8_t>, size) == 0,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_SizedResult_size_not_0);
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)COMPILE_ASSERT(offsetof(SizedResult<int8_t>, data) == 4,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_SizedResult_data_not_4);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The data for one attrib or uniform from GetProgramInfoCHROMIUM.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ProgramInput {
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t type;             // The type (GL_VEC3, GL_MAT3, GL_SAMPLER_2D, etc.
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int32_t size;              // The size (how big the array is for uniforms)
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t location_offset;  // offset from ProgramInfoHeader to 'size'
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             // locations for uniforms, 1 for attribs.
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t name_offset;      // offset from ProgrmaInfoHeader to start of name.
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t name_length;      // length of the name.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The format of the bucket filled out by GetProgramInfoCHROMIUM
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ProgramInfoHeader {
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t link_status;
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t num_attribs;
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t num_uniforms;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProgramInput inputs[num_attribs + num_uniforms];
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The format of QuerySync used by EXT_occlusion_query_boolean
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QuerySync {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_count = 0;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = 0;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::subtle::Atomic32 process_count;
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint64_t result;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochstruct AsyncUploadSync {
1584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  void Reset() {
1594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    base::subtle::Release_Store(&async_upload_token, 0);
1604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
1614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SetAsyncUploadToken(uint32_t token) {
1634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    DCHECK_NE(token, 0u);
1644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    base::subtle::Release_Store(&async_upload_token, token);
1654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
1664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool HasAsyncUploadTokenPassed(uint32_t token) {
1684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    DCHECK_NE(token, 0u);
1694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    uint32_t current_token = base::subtle::Acquire_Load(&async_upload_token);
1704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    return (current_token - token < 0x80000000);
1714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
1724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
1734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  base::subtle::Atomic32 async_upload_token;
1744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch};
1754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(sizeof(ProgramInput) == 20, ProgramInput_size_not_20);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInput, type) == 0,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInput_type_not_0);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInput, size) == 4,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInput_size_not_4);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInput, location_offset) == 8,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInput_location_offset_not_8);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInput, name_offset) == 12,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInput_name_offset_not_12);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInput, name_length) == 16,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInput_name_length_not_16);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(sizeof(ProgramInfoHeader) == 12, ProgramInfoHeader_size_not_12);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInfoHeader, link_status) == 0,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInfoHeader_link_status_not_0);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInfoHeader, num_attribs) == 4,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInfoHeader_num_attribs_not_4);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(ProgramInfoHeader, num_uniforms) == 8,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_ProgramInfoHeader_num_uniforms_not_8);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cmds {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../common/gles2_cmd_format_autogen.h"
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are hand written commands.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gman): Attempt to make these auto-generated.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)struct GenMailboxCHROMIUM {
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  typedef GenMailboxCHROMIUM ValueType;
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const CommandId kCmdId = kGenMailboxCHROMIUM;
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CommandHeader header;
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct InsertSyncPointCHROMIUM {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef InsertSyncPointCHROMIUM ValueType;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const CommandId kCmdId = kInsertSyncPointCHROMIUM;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandHeader header;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct CreateAndConsumeTextureCHROMIUMImmediate {
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef CreateAndConsumeTextureCHROMIUMImmediate ValueType;
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static const CommandId kCmdId = kCreateAndConsumeTextureCHROMIUMImmediate;
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1);
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static uint32_t ComputeDataSize() {
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return static_cast<uint32_t>(sizeof(GLbyte) * 64);  // NOLINT
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static uint32_t ComputeSize() {
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return static_cast<uint32_t>(sizeof(ValueType) +
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 ComputeDataSize());  // NOLINT
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetHeader(uint32_t size_in_bytes) {
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    header.SetCmdByTotalSize<ValueType>(size_in_bytes);
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Init(GLenum _target, uint32_t _client_id, const GLbyte* _mailbox) {
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SetHeader(ComputeSize());
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    target = _target;
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    client_id = _client_id;
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize());
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void* Set(void* cmd,
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            GLenum _target,
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            uint32_t _client_id,
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            const GLbyte* _mailbox) {
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    static_cast<ValueType*>(cmd)->Init(_target, _client_id, _mailbox);
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const uint32_t size = ComputeSize();
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gpu::CommandHeader header;
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32_t target;
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32_t client_id;
257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)COMPILE_ASSERT(sizeof(CreateAndConsumeTextureCHROMIUMImmediate) == 12,
260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               Sizeof_CreateAndConsumeTextureCHROMIUMImmediate_is_not_12);
261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)COMPILE_ASSERT(offsetof(CreateAndConsumeTextureCHROMIUMImmediate, header) == 0,
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               OffsetOf_CreateAndConsumeTextureCHROMIUMImmediate_header_not_0);
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)COMPILE_ASSERT(offsetof(CreateAndConsumeTextureCHROMIUMImmediate, target) == 4,
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               OffsetOf_CreateAndConsumeTextureCHROMIUMImmediate_target_not_4);
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)COMPILE_ASSERT(
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    offsetof(CreateAndConsumeTextureCHROMIUMImmediate, client_id) == 8,
267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    OffsetOf_CreateAndConsumeTextureCHROMIUMImmediate_client_id_not_8);
268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(pop)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cmd
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_
277