gles2_cmd_format.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// This file defines the GLES2 command buffer commands. 6 7#ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_ 8#define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_ 9 10 11#include <KHR/khrplatform.h> 12 13#include <stdint.h> 14#include <string.h> 15 16#include "base/atomicops.h" 17#include "base/logging.h" 18#include "base/macros.h" 19#include "gpu/command_buffer/common/bitfield_helpers.h" 20#include "gpu/command_buffer/common/cmd_buffer_common.h" 21#include "gpu/command_buffer/common/gles2_cmd_ids.h" 22 23// GL types are forward declared to avoid including the GL headers. The problem 24// is determining which GL headers to include from code that is common to the 25// client and service sides (GLES2 or one of several GL implementations). 26typedef unsigned int GLenum; 27typedef unsigned int GLbitfield; 28typedef unsigned int GLuint; 29typedef int GLint; 30typedef int GLsizei; 31typedef unsigned char GLboolean; 32typedef signed char GLbyte; 33typedef short GLshort; 34typedef unsigned char GLubyte; 35typedef unsigned short GLushort; 36typedef unsigned long GLulong; 37typedef float GLfloat; 38typedef float GLclampf; 39typedef double GLdouble; 40typedef double GLclampd; 41typedef void GLvoid; 42typedef khronos_intptr_t GLintptr; 43typedef khronos_ssize_t GLsizeiptr; 44 45namespace gpu { 46namespace gles2 { 47 48// Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned. 49#pragma pack(push, GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT) 50 51namespace id_namespaces { 52 53// These are used when contexts share resources. 54enum IdNamespaces { 55 kBuffers, 56 kFramebuffers, 57 kProgramsAndShaders, 58 kRenderbuffers, 59 kTextures, 60 kQueries, 61 kVertexArrays, 62 kNumIdNamespaces 63}; 64 65// These numbers must not change 66COMPILE_ASSERT(kBuffers == 0, kBuffers_is_not_0); 67COMPILE_ASSERT(kFramebuffers == 1, kFramebuffers_is_not_1); 68COMPILE_ASSERT(kProgramsAndShaders == 2, kProgramsAndShaders_is_not_2); 69COMPILE_ASSERT(kRenderbuffers == 3, kRenderbuffers_is_not_3); 70COMPILE_ASSERT(kTextures == 4, kTextures_is_not_4); 71 72} // namespace id_namespaces 73 74// Used for some glGetXXX commands that return a result through a pointer. We 75// need to know if the command succeeded or not and the size of the result. If 76// the command failed its result size will 0. 77template <typename T> 78struct SizedResult { 79 typedef T Type; 80 81 T* GetData() { 82 return static_cast<T*>(static_cast<void*>(&data)); 83 } 84 85 // Returns the total size in bytes of the SizedResult for a given number of 86 // results including the size field. 87 static size_t ComputeSize(size_t num_results) { 88 return sizeof(T) * num_results + sizeof(uint32_t); // NOLINT 89 } 90 91 // Returns the total size in bytes of the SizedResult for a given size of 92 // results. 93 static size_t ComputeSizeFromBytes(size_t size_of_result_in_bytes) { 94 return size_of_result_in_bytes + sizeof(uint32_t); // NOLINT 95 } 96 97 // Returns the maximum number of results for a given buffer size. 98 static uint32_t ComputeMaxResults(size_t size_of_buffer) { 99 return (size_of_buffer >= sizeof(uint32_t)) ? 100 ((size_of_buffer - sizeof(uint32_t)) / sizeof(T)) : 0; // NOLINT 101 } 102 103 // Set the size for a given number of results. 104 void SetNumResults(size_t num_results) { 105 size = sizeof(T) * num_results; // NOLINT 106 } 107 108 // Get the number of elements in the result 109 int32_t GetNumResults() const { 110 return size / sizeof(T); // NOLINT 111 } 112 113 // Copy the result. 114 void CopyResult(void* dst) const { 115 memcpy(dst, &data, size); 116 } 117 118 uint32_t size; // in bytes. 119 int32_t data; // this is just here to get an offset. 120}; 121 122COMPILE_ASSERT(sizeof(SizedResult<int8_t>) == 8, SizedResult_size_not_8); 123COMPILE_ASSERT(offsetof(SizedResult<int8_t>, size) == 0, 124 OffsetOf_SizedResult_size_not_0); 125COMPILE_ASSERT(offsetof(SizedResult<int8_t>, data) == 4, 126 OffsetOf_SizedResult_data_not_4); 127 128// The data for one attrib or uniform from GetProgramInfoCHROMIUM. 129struct ProgramInput { 130 uint32_t type; // The type (GL_VEC3, GL_MAT3, GL_SAMPLER_2D, etc. 131 int32_t size; // The size (how big the array is for uniforms) 132 uint32_t location_offset; // offset from ProgramInfoHeader to 'size' 133 // locations for uniforms, 1 for attribs. 134 uint32_t name_offset; // offset from ProgrmaInfoHeader to start of name. 135 uint32_t name_length; // length of the name. 136}; 137 138// The format of the bucket filled out by GetProgramInfoCHROMIUM 139struct ProgramInfoHeader { 140 uint32_t link_status; 141 uint32_t num_attribs; 142 uint32_t num_uniforms; 143 // ProgramInput inputs[num_attribs + num_uniforms]; 144}; 145 146// The format of QuerySync used by EXT_occlusion_query_boolean 147struct QuerySync { 148 void Reset() { 149 process_count = 0; 150 result = 0; 151 } 152 153 base::subtle::Atomic32 process_count; 154 uint64_t result; 155}; 156 157struct AsyncUploadSync { 158 void Reset() { 159 base::subtle::Release_Store(&async_upload_token, 0); 160 } 161 162 void SetAsyncUploadToken(uint32_t token) { 163 DCHECK_NE(token, 0u); 164 base::subtle::Release_Store(&async_upload_token, token); 165 } 166 167 bool HasAsyncUploadTokenPassed(uint32_t token) { 168 DCHECK_NE(token, 0u); 169 uint32_t current_token = base::subtle::Acquire_Load(&async_upload_token); 170 return (current_token - token < 0x80000000); 171 } 172 173 base::subtle::Atomic32 async_upload_token; 174}; 175 176COMPILE_ASSERT(sizeof(ProgramInput) == 20, ProgramInput_size_not_20); 177COMPILE_ASSERT(offsetof(ProgramInput, type) == 0, 178 OffsetOf_ProgramInput_type_not_0); 179COMPILE_ASSERT(offsetof(ProgramInput, size) == 4, 180 OffsetOf_ProgramInput_size_not_4); 181COMPILE_ASSERT(offsetof(ProgramInput, location_offset) == 8, 182 OffsetOf_ProgramInput_location_offset_not_8); 183COMPILE_ASSERT(offsetof(ProgramInput, name_offset) == 12, 184 OffsetOf_ProgramInput_name_offset_not_12); 185COMPILE_ASSERT(offsetof(ProgramInput, name_length) == 16, 186 OffsetOf_ProgramInput_name_length_not_16); 187 188COMPILE_ASSERT(sizeof(ProgramInfoHeader) == 12, ProgramInfoHeader_size_not_12); 189COMPILE_ASSERT(offsetof(ProgramInfoHeader, link_status) == 0, 190 OffsetOf_ProgramInfoHeader_link_status_not_0); 191COMPILE_ASSERT(offsetof(ProgramInfoHeader, num_attribs) == 4, 192 OffsetOf_ProgramInfoHeader_num_attribs_not_4); 193COMPILE_ASSERT(offsetof(ProgramInfoHeader, num_uniforms) == 8, 194 OffsetOf_ProgramInfoHeader_num_uniforms_not_8); 195 196namespace cmds { 197 198#include "../common/gles2_cmd_format_autogen.h" 199 200// These are hand written commands. 201// TODO(gman): Attempt to make these auto-generated. 202 203struct GetAttribLocation { 204 typedef GetAttribLocation ValueType; 205 static const CommandId kCmdId = kGetAttribLocation; 206 static const cmd::ArgFlags kArgFlags = cmd::kFixed; 207 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); 208 209 typedef GLint Result; 210 211 static uint32 ComputeSize() { 212 return static_cast<uint32>(sizeof(ValueType)); // NOLINT 213 } 214 215 void SetHeader() { 216 header.SetCmd<ValueType>(); 217 } 218 219 void Init( 220 GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, 221 uint32 _location_shm_id, uint32 _location_shm_offset, 222 uint32 _data_size) { 223 SetHeader(); 224 program = _program; 225 name_shm_id = _name_shm_id; 226 name_shm_offset = _name_shm_offset; 227 location_shm_id = _location_shm_id; 228 location_shm_offset = _location_shm_offset; 229 data_size = _data_size; 230 } 231 232 void* Set( 233 void* cmd, GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, 234 uint32 _location_shm_id, uint32 _location_shm_offset, 235 uint32 _data_size) { 236 static_cast<ValueType*>( 237 cmd)->Init( 238 _program, _name_shm_id, _name_shm_offset, _location_shm_id, 239 _location_shm_offset, _data_size); 240 return NextCmdAddress<ValueType>(cmd); 241 } 242 243 CommandHeader header; 244 uint32 program; 245 uint32 name_shm_id; 246 uint32 name_shm_offset; 247 uint32 location_shm_id; 248 uint32 location_shm_offset; 249 uint32 data_size; 250}; 251 252COMPILE_ASSERT(sizeof(GetAttribLocation) == 28, 253 Sizeof_GetAttribLocation_is_not_28); 254COMPILE_ASSERT(offsetof(GetAttribLocation, header) == 0, 255 OffsetOf_GetAttribLocation_header_not_0); 256COMPILE_ASSERT(offsetof(GetAttribLocation, program) == 4, 257 OffsetOf_GetAttribLocation_program_not_4); 258COMPILE_ASSERT(offsetof(GetAttribLocation, name_shm_id) == 8, 259 OffsetOf_GetAttribLocation_name_shm_id_not_8); 260COMPILE_ASSERT(offsetof(GetAttribLocation, name_shm_offset) == 12, 261 OffsetOf_GetAttribLocation_name_shm_offset_not_12); 262COMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_id) == 16, 263 OffsetOf_GetAttribLocation_location_shm_id_not_16); 264COMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_offset) == 20, 265 OffsetOf_GetAttribLocation_location_shm_offset_not_20); 266COMPILE_ASSERT(offsetof(GetAttribLocation, data_size) == 24, 267 OffsetOf_GetAttribLocation_data_size_not_24); 268 269 270struct GetAttribLocationBucket { 271 typedef GetAttribLocationBucket ValueType; 272 static const CommandId kCmdId = kGetAttribLocationBucket; 273 static const cmd::ArgFlags kArgFlags = cmd::kFixed; 274 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); 275 276 typedef GLint Result; 277 278 static uint32 ComputeSize() { 279 return static_cast<uint32>(sizeof(ValueType)); // NOLINT 280 } 281 282 void SetHeader() { 283 header.SetCmd<ValueType>(); 284 } 285 286 void Init( 287 GLuint _program, uint32 _name_bucket_id, 288 uint32 _location_shm_id, uint32 _location_shm_offset) { 289 SetHeader(); 290 program = _program; 291 name_bucket_id = _name_bucket_id; 292 location_shm_id = _location_shm_id; 293 location_shm_offset = _location_shm_offset; 294 } 295 296 void* Set( 297 void* cmd, GLuint _program, uint32 _name_bucket_id, 298 uint32 _location_shm_id, uint32 _location_shm_offset) { 299 static_cast<ValueType*>( 300 cmd)->Init( 301 _program, _name_bucket_id, _location_shm_id, 302 _location_shm_offset); 303 return NextCmdAddress<ValueType>(cmd); 304 } 305 306 CommandHeader header; 307 uint32 program; 308 uint32 name_bucket_id; 309 uint32 location_shm_id; 310 uint32 location_shm_offset; 311}; 312 313COMPILE_ASSERT(sizeof(GetAttribLocationBucket) == 20, 314 Sizeof_GetAttribLocationBucket_is_not_24); 315COMPILE_ASSERT(offsetof(GetAttribLocationBucket, header) == 0, 316 OffsetOf_GetAttribLocationBucket_header_not_0); 317COMPILE_ASSERT(offsetof(GetAttribLocationBucket, program) == 4, 318 OffsetOf_GetAttribLocationBucket_program_not_4); 319COMPILE_ASSERT(offsetof(GetAttribLocationBucket, name_bucket_id) == 8, 320 OffsetOf_GetAttribLocationBucket_name_bucket_id_not_8); 321COMPILE_ASSERT(offsetof(GetAttribLocationBucket, location_shm_id) == 12, 322 OffsetOf_GetAttribLocationBucket_location_shm_id_not_12); 323COMPILE_ASSERT(offsetof(GetAttribLocationBucket, location_shm_offset) == 16, 324 OffsetOf_GetAttribLocationBucket_location_shm_offset_not_16); 325 326struct GetUniformLocation { 327 typedef GetUniformLocation ValueType; 328 static const CommandId kCmdId = kGetUniformLocation; 329 static const cmd::ArgFlags kArgFlags = cmd::kFixed; 330 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); 331 332 typedef GLint Result; 333 334 static uint32 ComputeSize() { 335 return static_cast<uint32>(sizeof(ValueType)); // NOLINT 336 } 337 338 void SetHeader() { 339 header.SetCmd<ValueType>(); 340 } 341 342 void Init( 343 GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, 344 uint32 _location_shm_id, uint32 _location_shm_offset, 345 uint32 _data_size) { 346 SetHeader(); 347 program = _program; 348 name_shm_id = _name_shm_id; 349 name_shm_offset = _name_shm_offset; 350 location_shm_id = _location_shm_id; 351 location_shm_offset = _location_shm_offset; 352 data_size = _data_size; 353 } 354 355 void* Set( 356 void* cmd, GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, 357 uint32 _location_shm_id, uint32 _location_shm_offset, 358 uint32 _data_size) { 359 static_cast<ValueType*>( 360 cmd)->Init( 361 _program, _name_shm_id, _name_shm_offset, _location_shm_id, 362 _location_shm_offset, _data_size); 363 return NextCmdAddress<ValueType>(cmd); 364 } 365 366 CommandHeader header; 367 uint32 program; 368 uint32 name_shm_id; 369 uint32 name_shm_offset; 370 uint32 location_shm_id; 371 uint32 location_shm_offset; 372 uint32 data_size; 373}; 374 375COMPILE_ASSERT(sizeof(GetUniformLocation) == 28, 376 Sizeof_GetUniformLocation_is_not_28); 377COMPILE_ASSERT(offsetof(GetUniformLocation, header) == 0, 378 OffsetOf_GetUniformLocation_header_not_0); 379COMPILE_ASSERT(offsetof(GetUniformLocation, program) == 4, 380 OffsetOf_GetUniformLocation_program_not_4); 381COMPILE_ASSERT(offsetof(GetUniformLocation, name_shm_id) == 8, 382 OffsetOf_GetUniformLocation_name_shm_id_not_8); 383COMPILE_ASSERT(offsetof(GetUniformLocation, name_shm_offset) == 12, 384 OffsetOf_GetUniformLocation_name_shm_offset_not_12); 385COMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_id) == 16, 386 OffsetOf_GetUniformLocation_location_shm_id_not_16); 387COMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_offset) == 20, 388 OffsetOf_GetUniformLocation_location_shm_offset_not_20); 389COMPILE_ASSERT(offsetof(GetUniformLocation, data_size) == 24, 390 OffsetOf_GetUniformLocation_data_size_not_24); 391 392struct GetUniformLocationBucket { 393 typedef GetUniformLocationBucket ValueType; 394 static const CommandId kCmdId = kGetUniformLocationBucket; 395 static const cmd::ArgFlags kArgFlags = cmd::kFixed; 396 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); 397 398 typedef GLint Result; 399 400 static uint32 ComputeSize() { 401 return static_cast<uint32>(sizeof(ValueType)); // NOLINT 402 } 403 404 void SetHeader() { 405 header.SetCmd<ValueType>(); 406 } 407 408 void Init( 409 GLuint _program, uint32 _name_bucket_id, 410 uint32 _location_shm_id, uint32 _location_shm_offset) { 411 SetHeader(); 412 program = _program; 413 name_bucket_id = _name_bucket_id; 414 location_shm_id = _location_shm_id; 415 location_shm_offset = _location_shm_offset; 416 } 417 418 void* Set( 419 void* cmd, GLuint _program, uint32 _name_bucket_id, 420 uint32 _location_shm_id, uint32 _location_shm_offset) { 421 static_cast<ValueType*>( 422 cmd)->Init( 423 _program, _name_bucket_id, _location_shm_id, 424 _location_shm_offset); 425 return NextCmdAddress<ValueType>(cmd); 426 } 427 428 CommandHeader header; 429 uint32 program; 430 uint32 name_bucket_id; 431 uint32 location_shm_id; 432 uint32 location_shm_offset; 433}; 434 435COMPILE_ASSERT(sizeof(GetUniformLocationBucket) == 20, 436 Sizeof_GetUniformLocationBucket_is_not_24); 437COMPILE_ASSERT(offsetof(GetUniformLocationBucket, header) == 0, 438 OffsetOf_GetUniformLocationBucket_header_not_0); 439COMPILE_ASSERT(offsetof(GetUniformLocationBucket, program) == 4, 440 OffsetOf_GetUniformLocationBucket_program_not_4); 441COMPILE_ASSERT(offsetof(GetUniformLocationBucket, name_bucket_id) == 8, 442 OffsetOf_GetUniformLocationBucket_name_bucket_id_not_8); 443COMPILE_ASSERT(offsetof(GetUniformLocationBucket, location_shm_id) == 12, 444 OffsetOf_GetUniformLocationBucket_location_shm_id_not_12); 445COMPILE_ASSERT(offsetof(GetUniformLocationBucket, location_shm_offset) == 16, 446 OffsetOf_GetUniformLocationBucket_location_shm_offset_not_16); 447 448struct GenMailboxCHROMIUM { 449 typedef GenMailboxCHROMIUM ValueType; 450 static const CommandId kCmdId = kGenMailboxCHROMIUM; 451 static const cmd::ArgFlags kArgFlags = cmd::kFixed; 452 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); 453 CommandHeader header; 454}; 455 456struct InsertSyncPointCHROMIUM { 457 typedef InsertSyncPointCHROMIUM ValueType; 458 static const CommandId kCmdId = kInsertSyncPointCHROMIUM; 459 static const cmd::ArgFlags kArgFlags = cmd::kFixed; 460 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); 461 CommandHeader header; 462}; 463 464#pragma pack(pop) 465 466} // namespace cmd 467} // namespace gles2 468} // namespace gpu 469 470#endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_H_ 471