Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Side by Side Diff: gpu/command_buffer/client/program_info_manager.cc

Issue 895933004: Add UniformBlocks related commands to command buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@uniform
Patch Set: Working Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/client/program_info_manager.h" 5 #include "gpu/command_buffer/client/program_info_manager.h"
6 6
7 #include "base/numerics/safe_math.h"
8
9 namespace { 7 namespace {
10 8
11 template<typename T> static T LocalGetAs( 9 template<typename T> static T LocalGetAs(
12 const std::vector<int8>& data, uint32 offset, size_t size) { 10 const std::vector<int8>& data, uint32 offset, size_t size) {
13 const int8* p = &data[0] + offset; 11 const int8* p = &data[0] + offset;
14 if (offset + size > data.size()) { 12 if (offset + size > data.size()) {
15 NOTREACHED(); 13 NOTREACHED();
16 return NULL; 14 return NULL;
17 } 15 }
18 return static_cast<T>(static_cast<const void*>(p)); 16 return static_cast<T>(static_cast<const void*>(p));
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 if (cached_es3_uniform_blocks_) { 240 if (cached_es3_uniform_blocks_) {
243 return; 241 return;
244 } 242 }
245 if (result.empty()) { 243 if (result.empty()) {
246 // This should only happen on a lost context. 244 // This should only happen on a lost context.
247 return; 245 return;
248 } 246 }
249 uniform_blocks_.clear(); 247 uniform_blocks_.clear();
250 active_uniform_block_max_name_length_ = 0; 248 active_uniform_block_max_name_length_ = 0;
251 249
250 // |result| comes from GPU process. We consider it trusted data. Therefore,
251 // no need to check for overflows as the GPU side did the checks already.
252 uint32_t header_size = sizeof(UniformBlocksHeader); 252 uint32_t header_size = sizeof(UniformBlocksHeader);
253 DCHECK_GE(result.size(), header_size); 253 DCHECK_GE(result.size(), header_size);
254 const UniformBlocksHeader* header = LocalGetAs<const UniformBlocksHeader*>( 254 const UniformBlocksHeader* header = LocalGetAs<const UniformBlocksHeader*>(
255 result, 0, header_size); 255 result, 0, header_size);
256 DCHECK(header); 256 DCHECK(header);
257 if (header->num_uniform_blocks == 0) { 257 if (header->num_uniform_blocks == 0) {
258 DCHECK_EQ(result.size(), header_size); 258 DCHECK_EQ(result.size(), header_size);
259 // TODO(zmo): Here we can't tell if no uniform blocks are defined, or 259 // TODO(zmo): Here we can't tell if no uniform blocks are defined, or
260 // the previous link failed. 260 // the previous link failed.
261 return; 261 return;
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 529
530 GLuint ProgramInfoManager::GetUniformBlockIndex( 530 GLuint ProgramInfoManager::GetUniformBlockIndex(
531 GLES2Implementation* gl, GLuint program, const char* name) { 531 GLES2Implementation* gl, GLuint program, const char* name) {
532 { 532 {
533 base::AutoLock auto_lock(lock_); 533 base::AutoLock auto_lock(lock_);
534 Program* info = GetProgramInfo(gl, program, kES3UniformBlocks); 534 Program* info = GetProgramInfo(gl, program, kES3UniformBlocks);
535 if (info) { 535 if (info) {
536 return info->GetUniformBlockIndex(name); 536 return info->GetUniformBlockIndex(name);
537 } 537 }
538 } 538 }
539 return false; 539 return gl->GetUniformBlockIndexHelper(program, name);
540 // TODO(zmo): return gl->GetUniformBlockIndexHelper(program, name);
541 } 540 }
542 541
543 bool ProgramInfoManager::GetActiveUniformBlockName( 542 bool ProgramInfoManager::GetActiveUniformBlockName(
544 GLES2Implementation* gl, GLuint program, GLuint index, 543 GLES2Implementation* gl, GLuint program, GLuint index,
545 GLsizei buf_size, GLsizei* length, char* name) { 544 GLsizei buf_size, GLsizei* length, char* name) {
545 DCHECK_LE(0, buf_size);
546 if (!name) {
547 buf_size = 0;
548 }
546 { 549 {
547 base::AutoLock auto_lock(lock_); 550 base::AutoLock auto_lock(lock_);
548 Program* info = GetProgramInfo(gl, program, kES3UniformBlocks); 551 Program* info = GetProgramInfo(gl, program, kES3UniformBlocks);
549 if (info) { 552 if (info) {
550 const Program::UniformBlock* uniform_block = info->GetUniformBlock(index); 553 const Program::UniformBlock* uniform_block = info->GetUniformBlock(index);
551 if (uniform_block && buf_size >= 1) { 554 if (uniform_block) {
552 GLsizei written_size = std::min( 555 if (buf_size == 0) {
553 buf_size, static_cast<GLsizei>(uniform_block->name.size()) + 1); 556 if (length) {
554 if (length) { 557 *length = 0;
555 *length = written_size - 1; 558 }
559 } else if (length || name) {
560 GLsizei max_size = std::min(
561 buf_size - 1, static_cast<GLsizei>(uniform_block->name.size()));
562 if (length) {
563 *length = max_size;
564 }
565 if (name) {
566 memcpy(name, uniform_block->name.data(), max_size);
567 name[max_size] = '\0';
568 }
556 } 569 }
557 memcpy(name, uniform_block->name.c_str(), written_size);
558 return true; 570 return true;
559 } 571 }
560 } 572 }
561 } 573 }
562 return false; 574 return gl->GetActiveUniformBlockNameHelper(
563 // TODO(zmo): return gl->GetActiveUniformBlockNameHelper( 575 program, index, buf_size, length, name);
564 // program, index, buf_size, length, name);
565 } 576 }
566 577
567 bool ProgramInfoManager::GetActiveUniformBlockiv( 578 bool ProgramInfoManager::GetActiveUniformBlockiv(
568 GLES2Implementation* gl, GLuint program, GLuint index, 579 GLES2Implementation* gl, GLuint program, GLuint index,
569 GLenum pname, GLint* params) { 580 GLenum pname, GLint* params) {
570 { 581 {
571 base::AutoLock auto_lock(lock_); 582 base::AutoLock auto_lock(lock_);
572 Program* info = GetProgramInfo(gl, program, kES3UniformBlocks); 583 Program* info = GetProgramInfo(gl, program, kES3UniformBlocks);
573 if (info) { 584 if (info) {
574 const Program::UniformBlock* uniform_block = info->GetUniformBlock(index); 585 const Program::UniformBlock* uniform_block = info->GetUniformBlock(index);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 } 636 }
626 } 637 }
627 return false; 638 return false;
628 // TODO(zmo): return gl->GetActiveUniformBlockivHelper( 639 // TODO(zmo): return gl->GetActiveUniformBlockivHelper(
629 // program, index, pname, params); 640 // program, index, pname, params);
630 } 641 }
631 642
632 } // namespace gles2 643 } // namespace gles2
633 } // namespace gpu 644 } // namespace gpu
634 645
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698