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

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

Issue 8914016: Revert "Reverting as this is suspected of causing check_deps failure on Linux bot" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // A class to emulate GLES2 over command buffers. 5 // A class to emulate GLES2 over command buffers.
6 6
7 #include "../client/gles2_implementation.h" 7 #include "../client/gles2_implementation.h"
8 8
9 #include <set> 9 #include <set>
10 #include <queue> 10 #include <queue>
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 return buffer_id_; 596 return buffer_id_;
597 } 597 }
598 598
599 #if !defined(_MSC_VER) 599 #if !defined(_MSC_VER)
600 const size_t GLES2Implementation::kMaxSizeOfSimpleResult; 600 const size_t GLES2Implementation::kMaxSizeOfSimpleResult;
601 #endif 601 #endif
602 602
603 COMPILE_ASSERT(gpu::kInvalidResource == 0, 603 COMPILE_ASSERT(gpu::kInvalidResource == 0,
604 INVALID_RESOURCE_NOT_0_AS_GL_EXPECTS); 604 INVALID_RESOURCE_NOT_0_AS_GL_EXPECTS);
605 605
606 GLES2Implementation::SingleThreadChecker::SingleThreadChecker(
607 GLES2Implementation* gles2_implementation)
608 : gles2_implementation_(gles2_implementation) {
609 GPU_CHECK_EQ(0, gles2_implementation_->use_count_);
610 ++gles2_implementation_->use_count_;
611 }
612
613 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() {
614 --gles2_implementation_->use_count_;
615 GPU_CHECK_EQ(0, gles2_implementation_->use_count_);
616 }
617
606 GLES2Implementation::GLES2Implementation( 618 GLES2Implementation::GLES2Implementation(
607 GLES2CmdHelper* helper, 619 GLES2CmdHelper* helper,
608 size_t transfer_buffer_size, 620 size_t transfer_buffer_size,
609 void* transfer_buffer, 621 void* transfer_buffer,
610 int32 transfer_buffer_id, 622 int32 transfer_buffer_id,
611 bool share_resources, 623 bool share_resources,
612 bool bind_generates_resource) 624 bool bind_generates_resource)
613 : helper_(helper), 625 : helper_(helper),
614 transfer_buffer_( 626 transfer_buffer_(
615 helper, 627 helper,
(...skipping 10 matching lines...) Expand all
626 active_texture_unit_(0), 638 active_texture_unit_(0),
627 bound_framebuffer_(0), 639 bound_framebuffer_(0),
628 bound_renderbuffer_(0), 640 bound_renderbuffer_(0),
629 bound_array_buffer_id_(0), 641 bound_array_buffer_id_(0),
630 bound_element_array_buffer_id_(0), 642 bound_element_array_buffer_id_(0),
631 client_side_array_id_(0), 643 client_side_array_id_(0),
632 client_side_element_array_id_(0), 644 client_side_element_array_id_(0),
633 error_bits_(0), 645 error_bits_(0),
634 debug_(false), 646 debug_(false),
635 sharing_resources_(share_resources), 647 sharing_resources_(share_resources),
636 bind_generates_resource_(bind_generates_resource) { 648 bind_generates_resource_(bind_generates_resource),
649 use_count_(0) {
637 GPU_CLIENT_LOG_CODE_BLOCK({ 650 GPU_CLIENT_LOG_CODE_BLOCK({
638 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( 651 debug_ = CommandLine::ForCurrentProcess()->HasSwitch(
639 switches::kEnableGPUClientLogging); 652 switches::kEnableGPUClientLogging);
640 }); 653 });
641 654
642 memset(&reserved_ids_, 0, sizeof(reserved_ids_)); 655 memset(&reserved_ids_, 0, sizeof(reserved_ids_));
643 656
644 mapped_memory_.reset(new MappedMemoryManager(helper_)); 657 mapped_memory_.reset(new MappedMemoryManager(helper_));
645 SetSharedMemoryChunkSizeMultiple(1024 * 1024 * 2); 658 SetSharedMemoryChunkSizeMultiple(1024 * 1024 * 2);
646 659
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 angle_pack_reverse_row_order_status = kAvailableExtensionStatus; 773 angle_pack_reverse_row_order_status = kAvailableExtensionStatus;
761 return true; 774 return true;
762 } else { 775 } else {
763 angle_pack_reverse_row_order_status = kUnavailableExtensionStatus; 776 angle_pack_reverse_row_order_status = kUnavailableExtensionStatus;
764 return false; 777 return false;
765 } 778 }
766 } 779 }
767 } 780 }
768 781
769 GLenum GLES2Implementation::GetError() { 782 GLenum GLES2Implementation::GetError() {
783 GPU_CLIENT_SINGLE_THREAD_CHECK();
770 GPU_CLIENT_LOG("[" << this << "] glGetError()"); 784 GPU_CLIENT_LOG("[" << this << "] glGetError()");
771 GLenum err = GetGLError(); 785 GLenum err = GetGLError();
772 GPU_CLIENT_LOG("returned " << GLES2Util::GetStringError(err)); 786 GPU_CLIENT_LOG("returned " << GLES2Util::GetStringError(err));
773 return err; 787 return err;
774 } 788 }
775 789
776 GLenum GLES2Implementation::GetGLError() { 790 GLenum GLES2Implementation::GetGLError() {
777 TRACE_EVENT0("gpu", "GLES2::GetGLError"); 791 TRACE_EVENT0("gpu", "GLES2::GetGLError");
778 // Check the GL error first, then our wrapped error. 792 // Check the GL error first, then our wrapped error.
779 typedef gles2::GetError::Result Result; 793 typedef gles2::GetError::Result Result;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 *params = static_cast<GLfloat>(value); 1012 *params = static_cast<GLfloat>(value);
999 return true; 1013 return true;
1000 } 1014 }
1001 1015
1002 bool GLES2Implementation::GetIntegervHelper(GLenum pname, GLint* params) { 1016 bool GLES2Implementation::GetIntegervHelper(GLenum pname, GLint* params) {
1003 return GetHelper(pname, params); 1017 return GetHelper(pname, params);
1004 } 1018 }
1005 1019
1006 void GLES2Implementation::DrawElements( 1020 void GLES2Implementation::DrawElements(
1007 GLenum mode, GLsizei count, GLenum type, const void* indices) { 1021 GLenum mode, GLsizei count, GLenum type, const void* indices) {
1022 GPU_CLIENT_SINGLE_THREAD_CHECK();
1008 GPU_CLIENT_LOG("[" << this << "] glDrawElements(" 1023 GPU_CLIENT_LOG("[" << this << "] glDrawElements("
1009 << GLES2Util::GetStringDrawMode(mode) << ", " 1024 << GLES2Util::GetStringDrawMode(mode) << ", "
1010 << count << ", " 1025 << count << ", "
1011 << GLES2Util::GetStringIndexType(type) << ", " 1026 << GLES2Util::GetStringIndexType(type) << ", "
1012 << static_cast<const void*>(indices) << ")"); 1027 << static_cast<const void*>(indices) << ")");
1013 if (count < 0) { 1028 if (count < 0) {
1014 SetGLError(GL_INVALID_VALUE, "glDrawElements: count less than 0."); 1029 SetGLError(GL_INVALID_VALUE, "glDrawElements: count less than 0.");
1015 return; 1030 return;
1016 } 1031 }
1017 if (count == 0) { 1032 if (count == 0) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 if (bound_element_array_buffer_id_ == 0) { 1065 if (bound_element_array_buffer_id_ == 0) {
1051 // Restore the element array binding. 1066 // Restore the element array binding.
1052 helper_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 1067 helper_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
1053 } 1068 }
1054 #else 1069 #else
1055 helper_->DrawElements(mode, count, type, ToGLuint(indices)); 1070 helper_->DrawElements(mode, count, type, ToGLuint(indices));
1056 #endif 1071 #endif
1057 } 1072 }
1058 1073
1059 void GLES2Implementation::Flush() { 1074 void GLES2Implementation::Flush() {
1075 GPU_CLIENT_SINGLE_THREAD_CHECK();
1060 GPU_CLIENT_LOG("[" << this << "] glFlush()"); 1076 GPU_CLIENT_LOG("[" << this << "] glFlush()");
1061 // Insert the cmd to call glFlush 1077 // Insert the cmd to call glFlush
1062 helper_->Flush(); 1078 helper_->Flush();
1063 // Flush our command buffer 1079 // Flush our command buffer
1064 // (tell the service to execute up to the flush cmd.) 1080 // (tell the service to execute up to the flush cmd.)
1065 helper_->CommandBufferHelper::Flush(); 1081 helper_->CommandBufferHelper::Flush();
1066 } 1082 }
1067 1083
1068 void GLES2Implementation::Finish() { 1084 void GLES2Implementation::Finish() {
1085 GPU_CLIENT_SINGLE_THREAD_CHECK();
1069 GPU_CLIENT_LOG("[" << this << "] glFinish()"); 1086 GPU_CLIENT_LOG("[" << this << "] glFinish()");
1070 TRACE_EVENT0("gpu", "GLES2::Finish"); 1087 TRACE_EVENT0("gpu", "GLES2::Finish");
1071 // Insert the cmd to call glFinish 1088 // Insert the cmd to call glFinish
1072 helper_->Finish(); 1089 helper_->Finish();
1073 // Finish our command buffer 1090 // Finish our command buffer
1074 // (tell the service to execute up to the Finish cmd and wait for it to 1091 // (tell the service to execute up to the Finish cmd and wait for it to
1075 // execute.) 1092 // execute.)
1076 helper_->CommandBufferHelper::Finish(); 1093 helper_->CommandBufferHelper::Finish();
1077 } 1094 }
1078 1095
1079 void GLES2Implementation::SwapBuffers() { 1096 void GLES2Implementation::SwapBuffers() {
1097 GPU_CLIENT_SINGLE_THREAD_CHECK();
1080 GPU_CLIENT_LOG("[" << this << "] glSwapBuffers()"); 1098 GPU_CLIENT_LOG("[" << this << "] glSwapBuffers()");
1081 // TODO(piman): Strictly speaking we'd want to insert the token after the 1099 // TODO(piman): Strictly speaking we'd want to insert the token after the
1082 // swap, but the state update with the updated token might not have happened 1100 // swap, but the state update with the updated token might not have happened
1083 // by the time the SwapBuffer callback gets called, forcing us to synchronize 1101 // by the time the SwapBuffer callback gets called, forcing us to synchronize
1084 // with the GPU process more than needed. So instead, make it happen before. 1102 // with the GPU process more than needed. So instead, make it happen before.
1085 // All it means is that we could be slightly looser on the kMaxSwapBuffers 1103 // All it means is that we could be slightly looser on the kMaxSwapBuffers
1086 // semantics if the client doesn't use the callback mechanism, and by chance 1104 // semantics if the client doesn't use the callback mechanism, and by chance
1087 // the scheduler yields between the InsertToken and the SwapBuffers. 1105 // the scheduler yields between the InsertToken and the SwapBuffers.
1088 swap_buffers_tokens_.push(helper_->InsertToken()); 1106 swap_buffers_tokens_.push(helper_->InsertToken());
1089 helper_->SwapBuffers(); 1107 helper_->SwapBuffers();
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1178 transfer_buffer->GetOffset(id_buffer)); 1196 transfer_buffer->GetOffset(id_buffer));
1179 WaitForCmd(); 1197 WaitForCmd();
1180 transfer_buffer->FreePendingToken(id_buffer, helper_->InsertToken()); 1198 transfer_buffer->FreePendingToken(id_buffer, helper_->InsertToken());
1181 n -= num; 1199 n -= num;
1182 ids += num; 1200 ids += num;
1183 } 1201 }
1184 } 1202 }
1185 1203
1186 void GLES2Implementation::BindAttribLocation( 1204 void GLES2Implementation::BindAttribLocation(
1187 GLuint program, GLuint index, const char* name) { 1205 GLuint program, GLuint index, const char* name) {
1206 GPU_CLIENT_SINGLE_THREAD_CHECK();
1188 GPU_CLIENT_LOG("[" << this << "] glBindAttribLocation(" << program << ", " 1207 GPU_CLIENT_LOG("[" << this << "] glBindAttribLocation(" << program << ", "
1189 << index << ", " << name << ")"); 1208 << index << ", " << name << ")");
1190 SetBucketAsString(kResultBucketId, name); 1209 SetBucketAsString(kResultBucketId, name);
1191 helper_->BindAttribLocationBucket(program, index, kResultBucketId); 1210 helper_->BindAttribLocationBucket(program, index, kResultBucketId);
1192 helper_->SetBucketSize(kResultBucketId, 0); 1211 helper_->SetBucketSize(kResultBucketId, 0);
1193 } 1212 }
1194 1213
1195 void GLES2Implementation::GetVertexAttribPointerv( 1214 void GLES2Implementation::GetVertexAttribPointerv(
1196 GLuint index, GLenum pname, void** ptr) { 1215 GLuint index, GLenum pname, void** ptr) {
1216 GPU_CLIENT_SINGLE_THREAD_CHECK();
1197 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribPointer(" << index << ", " 1217 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribPointer(" << index << ", "
1198 << GLES2Util::GetStringVertexPointer(pname) << ", " 1218 << GLES2Util::GetStringVertexPointer(pname) << ", "
1199 << static_cast<void*>(ptr) << ")"); 1219 << static_cast<void*>(ptr) << ")");
1200 1220
1201 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1221 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1202 // If it's a client side buffer the client has the data. 1222 // If it's a client side buffer the client has the data.
1203 if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) { 1223 if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) {
1204 return; 1224 return;
1205 } 1225 }
1206 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1226 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 SetBucketAsCString(kResultBucketId, name); 1272 SetBucketAsCString(kResultBucketId, name);
1253 helper_->GetAttribLocationBucket( 1273 helper_->GetAttribLocationBucket(
1254 program, kResultBucketId, GetResultShmId(), GetResultShmOffset()); 1274 program, kResultBucketId, GetResultShmId(), GetResultShmOffset());
1255 WaitForCmd(); 1275 WaitForCmd();
1256 helper_->SetBucketSize(kResultBucketId, 0); 1276 helper_->SetBucketSize(kResultBucketId, 0);
1257 return *result; 1277 return *result;
1258 } 1278 }
1259 1279
1260 GLint GLES2Implementation::GetAttribLocation( 1280 GLint GLES2Implementation::GetAttribLocation(
1261 GLuint program, const char* name) { 1281 GLuint program, const char* name) {
1282 GPU_CLIENT_SINGLE_THREAD_CHECK();
1262 GPU_CLIENT_LOG("[" << this << "] glGetAttribLocation(" << program 1283 GPU_CLIENT_LOG("[" << this << "] glGetAttribLocation(" << program
1263 << ", " << name << ")"); 1284 << ", " << name << ")");
1264 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); 1285 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation");
1265 GLint loc = program_info_manager_->GetAttribLocation(this, program, name); 1286 GLint loc = program_info_manager_->GetAttribLocation(this, program, name);
1266 GPU_CLIENT_LOG("returned " << loc); 1287 GPU_CLIENT_LOG("returned " << loc);
1267 return loc; 1288 return loc;
1268 } 1289 }
1269 1290
1270 GLint GLES2Implementation::GetUniformLocationHelper( 1291 GLint GLES2Implementation::GetUniformLocationHelper(
1271 GLuint program, const char* name) { 1292 GLuint program, const char* name) {
1272 typedef GetUniformLocationBucket::Result Result; 1293 typedef GetUniformLocationBucket::Result Result;
1273 Result* result = GetResultAs<Result*>(); 1294 Result* result = GetResultAs<Result*>();
1274 *result = -1; 1295 *result = -1;
1275 SetBucketAsCString(kResultBucketId, name); 1296 SetBucketAsCString(kResultBucketId, name);
1276 helper_->GetUniformLocationBucket(program, kResultBucketId, 1297 helper_->GetUniformLocationBucket(program, kResultBucketId,
1277 GetResultShmId(), GetResultShmOffset()); 1298 GetResultShmId(), GetResultShmOffset());
1278 WaitForCmd(); 1299 WaitForCmd();
1279 helper_->SetBucketSize(kResultBucketId, 0); 1300 helper_->SetBucketSize(kResultBucketId, 0);
1280 return *result; 1301 return *result;
1281 } 1302 }
1282 1303
1283 GLint GLES2Implementation::GetUniformLocation( 1304 GLint GLES2Implementation::GetUniformLocation(
1284 GLuint program, const char* name) { 1305 GLuint program, const char* name) {
1306 GPU_CLIENT_SINGLE_THREAD_CHECK();
1285 GPU_CLIENT_LOG("[" << this << "] glGetUniformLocation(" << program 1307 GPU_CLIENT_LOG("[" << this << "] glGetUniformLocation(" << program
1286 << ", " << name << ")"); 1308 << ", " << name << ")");
1287 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); 1309 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation");
1288 GLint loc = program_info_manager_->GetUniformLocation(this, program, name); 1310 GLint loc = program_info_manager_->GetUniformLocation(this, program, name);
1289 GPU_CLIENT_LOG("returned " << loc); 1311 GPU_CLIENT_LOG("returned " << loc);
1290 return loc; 1312 return loc;
1291 } 1313 }
1292 1314
1293 bool GLES2Implementation::GetProgramivHelper( 1315 bool GLES2Implementation::GetProgramivHelper(
1294 GLuint program, GLenum pname, GLint* params) { 1316 GLuint program, GLenum pname, GLint* params) {
1295 return program_info_manager_->GetProgramiv(this, program, pname, params); 1317 return program_info_manager_->GetProgramiv(this, program, pname, params);
1296 } 1318 }
1297 1319
1298 void GLES2Implementation::LinkProgram(GLuint program) { 1320 void GLES2Implementation::LinkProgram(GLuint program) {
1321 GPU_CLIENT_SINGLE_THREAD_CHECK();
1299 GPU_CLIENT_LOG("[" << this << "] glLinkProgram(" << program << ")"); 1322 GPU_CLIENT_LOG("[" << this << "] glLinkProgram(" << program << ")");
1300 helper_->LinkProgram(program); 1323 helper_->LinkProgram(program);
1301 program_info_manager_->CreateInfo(program); 1324 program_info_manager_->CreateInfo(program);
1302 } 1325 }
1303 1326
1304 void GLES2Implementation::ShaderBinary( 1327 void GLES2Implementation::ShaderBinary(
1305 GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, 1328 GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary,
1306 GLsizei length) { 1329 GLsizei length) {
1330 GPU_CLIENT_SINGLE_THREAD_CHECK();
1307 GPU_CLIENT_LOG("[" << this << "] glShaderBinary(" << n << ", " 1331 GPU_CLIENT_LOG("[" << this << "] glShaderBinary(" << n << ", "
1308 << static_cast<const void*>(shaders) << ", " 1332 << static_cast<const void*>(shaders) << ", "
1309 << GLES2Util::GetStringEnum(binaryformat) << ", " 1333 << GLES2Util::GetStringEnum(binaryformat) << ", "
1310 << static_cast<const void*>(binary) << ", " 1334 << static_cast<const void*>(binary) << ", "
1311 << length << ")"); 1335 << length << ")");
1312 if (n < 0) { 1336 if (n < 0) {
1313 SetGLError(GL_INVALID_VALUE, "glShaderBinary n < 0."); 1337 SetGLError(GL_INVALID_VALUE, "glShaderBinary n < 0.");
1314 return; 1338 return;
1315 } 1339 }
1316 if (length < 0) { 1340 if (length < 0) {
(...skipping 12 matching lines...) Expand all
1329 transfer_buffer->GetShmId(), 1353 transfer_buffer->GetShmId(),
1330 transfer_buffer->GetOffset(shader_ids), 1354 transfer_buffer->GetOffset(shader_ids),
1331 binaryformat, 1355 binaryformat,
1332 transfer_buffer->GetShmId(), 1356 transfer_buffer->GetShmId(),
1333 transfer_buffer->GetOffset(shader_data), 1357 transfer_buffer->GetOffset(shader_data),
1334 length); 1358 length);
1335 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken()); 1359 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
1336 } 1360 }
1337 1361
1338 void GLES2Implementation::PixelStorei(GLenum pname, GLint param) { 1362 void GLES2Implementation::PixelStorei(GLenum pname, GLint param) {
1363 GPU_CLIENT_SINGLE_THREAD_CHECK();
1339 GPU_CLIENT_LOG("[" << this << "] glPixelStorei(" 1364 GPU_CLIENT_LOG("[" << this << "] glPixelStorei("
1340 << GLES2Util::GetStringPixelStore(pname) << ", " 1365 << GLES2Util::GetStringPixelStore(pname) << ", "
1341 << param << ")"); 1366 << param << ")");
1342 switch (pname) { 1367 switch (pname) {
1343 case GL_PACK_ALIGNMENT: 1368 case GL_PACK_ALIGNMENT:
1344 pack_alignment_ = param; 1369 pack_alignment_ = param;
1345 break; 1370 break;
1346 case GL_UNPACK_ALIGNMENT: 1371 case GL_UNPACK_ALIGNMENT:
1347 unpack_alignment_ = param; 1372 unpack_alignment_ = param;
1348 break; 1373 break;
1349 case GL_UNPACK_FLIP_Y_CHROMIUM: 1374 case GL_UNPACK_FLIP_Y_CHROMIUM:
1350 unpack_flip_y_ = (param != 0); 1375 unpack_flip_y_ = (param != 0);
1351 return; 1376 return;
1352 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: 1377 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1353 pack_reverse_row_order_ = 1378 pack_reverse_row_order_ =
1354 IsAnglePackReverseRowOrderAvailable() ? (param != 0) : false; 1379 IsAnglePackReverseRowOrderAvailable() ? (param != 0) : false;
1355 break; 1380 break;
1356 default: 1381 default:
1357 break; 1382 break;
1358 } 1383 }
1359 helper_->PixelStorei(pname, param); 1384 helper_->PixelStorei(pname, param);
1360 } 1385 }
1361 1386
1362 1387
1363 void GLES2Implementation::VertexAttribPointer( 1388 void GLES2Implementation::VertexAttribPointer(
1364 GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, 1389 GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,
1365 const void* ptr) { 1390 const void* ptr) {
1391 GPU_CLIENT_SINGLE_THREAD_CHECK();
1366 GPU_CLIENT_LOG("[" << this << "] glVertexAttribPointer(" 1392 GPU_CLIENT_LOG("[" << this << "] glVertexAttribPointer("
1367 << index << ", " 1393 << index << ", "
1368 << size << ", " 1394 << size << ", "
1369 << GLES2Util::GetStringVertexAttribType(type) << ", " 1395 << GLES2Util::GetStringVertexAttribType(type) << ", "
1370 << GLES2Util::GetStringBool(normalized) << ", " 1396 << GLES2Util::GetStringBool(normalized) << ", "
1371 << stride << ", " 1397 << stride << ", "
1372 << static_cast<const void*>(ptr) << ")"); 1398 << static_cast<const void*>(ptr) << ")");
1373 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1399 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1374 // Record the info on the client side. 1400 // Record the info on the client side.
1375 client_side_buffer_helper_->SetAttribPointer( 1401 client_side_buffer_helper_->SetAttribPointer(
1376 bound_array_buffer_id_, index, size, type, normalized, stride, ptr); 1402 bound_array_buffer_id_, index, size, type, normalized, stride, ptr);
1377 if (bound_array_buffer_id_ != 0) { 1403 if (bound_array_buffer_id_ != 0) {
1378 // Only report NON client side buffers to the service. 1404 // Only report NON client side buffers to the service.
1379 helper_->VertexAttribPointer(index, size, type, normalized, stride, 1405 helper_->VertexAttribPointer(index, size, type, normalized, stride,
1380 ToGLuint(ptr)); 1406 ToGLuint(ptr));
1381 } 1407 }
1382 #else // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1408 #else // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1383 helper_->VertexAttribPointer(index, size, type, normalized, stride, 1409 helper_->VertexAttribPointer(index, size, type, normalized, stride,
1384 ToGLuint(ptr)); 1410 ToGLuint(ptr));
1385 #endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1411 #endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1386 } 1412 }
1387 1413
1388 void GLES2Implementation::ShaderSource( 1414 void GLES2Implementation::ShaderSource(
1389 GLuint shader, GLsizei count, const char** source, const GLint* length) { 1415 GLuint shader, GLsizei count, const char** source, const GLint* length) {
1416 GPU_CLIENT_SINGLE_THREAD_CHECK();
1390 GPU_CLIENT_LOG("[" << this << "] glShaderSource(" 1417 GPU_CLIENT_LOG("[" << this << "] glShaderSource("
1391 << shader << ", " << count << ", " 1418 << shader << ", " << count << ", "
1392 << static_cast<const void*>(source) << ", " 1419 << static_cast<const void*>(source) << ", "
1393 << static_cast<const void*>(length) << ")"); 1420 << static_cast<const void*>(length) << ")");
1394 GPU_CLIENT_LOG_CODE_BLOCK({ 1421 GPU_CLIENT_LOG_CODE_BLOCK({
1395 for (GLsizei ii = 0; ii < count; ++ii) { 1422 for (GLsizei ii = 0; ii < count; ++ii) {
1396 if (source[ii]) { 1423 if (source[ii]) {
1397 if (length && length[ii] >= 0) { 1424 if (length && length[ii] >= 0) {
1398 std::string str(source[ii], length[ii]); 1425 std::string str(source[ii], length[ii]);
1399 GPU_CLIENT_LOG(" " << ii << ": ---\n" << str << "\n---"); 1426 GPU_CLIENT_LOG(" " << ii << ": ---\n" << str << "\n---");
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 } 1476 }
1450 1477
1451 GPU_DCHECK_EQ(total_size, offset); 1478 GPU_DCHECK_EQ(total_size, offset);
1452 1479
1453 helper_->ShaderSourceBucket(shader, kResultBucketId); 1480 helper_->ShaderSourceBucket(shader, kResultBucketId);
1454 helper_->SetBucketSize(kResultBucketId, 0); 1481 helper_->SetBucketSize(kResultBucketId, 0);
1455 } 1482 }
1456 1483
1457 void GLES2Implementation::BufferData( 1484 void GLES2Implementation::BufferData(
1458 GLenum target, GLsizeiptr size, const void* data, GLenum usage) { 1485 GLenum target, GLsizeiptr size, const void* data, GLenum usage) {
1486 GPU_CLIENT_SINGLE_THREAD_CHECK();
1459 GPU_CLIENT_LOG("[" << this << "] glBufferData(" 1487 GPU_CLIENT_LOG("[" << this << "] glBufferData("
1460 << GLES2Util::GetStringBufferTarget(target) << ", " 1488 << GLES2Util::GetStringBufferTarget(target) << ", "
1461 << size << ", " 1489 << size << ", "
1462 << static_cast<const void*>(data) << ", " 1490 << static_cast<const void*>(data) << ", "
1463 << GLES2Util::GetStringBufferUsage(usage) << ")"); 1491 << GLES2Util::GetStringBufferUsage(usage) << ")");
1464 AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer(); 1492 AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
1465 GLsizeiptr max_size = transfer_buffer->GetLargestFreeOrPendingSize(); 1493 GLsizeiptr max_size = transfer_buffer->GetLargestFreeOrPendingSize();
1466 if (size > max_size || !data) { 1494 if (size > max_size || !data) {
1467 helper_->BufferData(target, size, 0, 0, usage); 1495 helper_->BufferData(target, size, 0, 0, usage);
1468 if (data != NULL) { 1496 if (data != NULL) {
1469 BufferSubData(target, 0, size, data); 1497 BufferSubData(target, 0, size, data);
1470 } 1498 }
1471 return; 1499 return;
1472 } 1500 }
1473 1501
1474 void* buffer = transfer_buffer->Alloc(size); 1502 void* buffer = transfer_buffer->Alloc(size);
1475 memcpy(buffer, data, size); 1503 memcpy(buffer, data, size);
1476 helper_->BufferData( 1504 helper_->BufferData(
1477 target, 1505 target,
1478 size, 1506 size,
1479 transfer_buffer->GetShmId(), 1507 transfer_buffer->GetShmId(),
1480 transfer_buffer->GetOffset(buffer), 1508 transfer_buffer->GetOffset(buffer),
1481 usage); 1509 usage);
1482 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken()); 1510 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
1483 } 1511 }
1484 1512
1485 void GLES2Implementation::BufferSubData( 1513 void GLES2Implementation::BufferSubData(
1486 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { 1514 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) {
1515 GPU_CLIENT_SINGLE_THREAD_CHECK();
1487 GPU_CLIENT_LOG("[" << this << "] glBufferSubData(" 1516 GPU_CLIENT_LOG("[" << this << "] glBufferSubData("
1488 << GLES2Util::GetStringBufferTarget(target) << ", " 1517 << GLES2Util::GetStringBufferTarget(target) << ", "
1489 << offset << ", " << size << ", " 1518 << offset << ", " << size << ", "
1490 << static_cast<const void*>(data) << ")"); 1519 << static_cast<const void*>(data) << ")");
1491 if (size == 0) { 1520 if (size == 0) {
1492 return; 1521 return;
1493 } 1522 }
1494 1523
1495 if (size < 0) { 1524 if (size < 0) {
1496 SetGLError(GL_INVALID_VALUE, "glBufferSubData: size < 0"); 1525 SetGLError(GL_INVALID_VALUE, "glBufferSubData: size < 0");
(...skipping 13 matching lines...) Expand all
1510 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken()); 1539 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
1511 offset += part_size; 1540 offset += part_size;
1512 source += part_size; 1541 source += part_size;
1513 size -= part_size; 1542 size -= part_size;
1514 } 1543 }
1515 } 1544 }
1516 1545
1517 void GLES2Implementation::CompressedTexImage2D( 1546 void GLES2Implementation::CompressedTexImage2D(
1518 GLenum target, GLint level, GLenum internalformat, GLsizei width, 1547 GLenum target, GLint level, GLenum internalformat, GLsizei width,
1519 GLsizei height, GLint border, GLsizei image_size, const void* data) { 1548 GLsizei height, GLint border, GLsizei image_size, const void* data) {
1549 GPU_CLIENT_SINGLE_THREAD_CHECK();
1520 GPU_CLIENT_LOG("[" << this << "] glCompressedTexImage2D(" 1550 GPU_CLIENT_LOG("[" << this << "] glCompressedTexImage2D("
1521 << GLES2Util::GetStringTextureTarget(target) << ", " 1551 << GLES2Util::GetStringTextureTarget(target) << ", "
1522 << level << ", " 1552 << level << ", "
1523 << GLES2Util::GetStringCompressedTextureFormat(internalformat) << ", " 1553 << GLES2Util::GetStringCompressedTextureFormat(internalformat) << ", "
1524 << width << ", " << height << ", " << border << ", " 1554 << width << ", " << height << ", " << border << ", "
1525 << image_size << ", " 1555 << image_size << ", "
1526 << static_cast<const void*>(data) << ")"); 1556 << static_cast<const void*>(data) << ")");
1527 if (width < 0 || height < 0 || level < 0) { 1557 if (width < 0 || height < 0 || level < 0) {
1528 SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D dimension < 0"); 1558 SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D dimension < 0");
1529 return; 1559 return;
1530 } 1560 }
1531 if (height == 0 || width == 0) { 1561 if (height == 0 || width == 0) {
1532 return; 1562 return;
1533 } 1563 }
1534 SetBucketContents(kResultBucketId, data, image_size); 1564 SetBucketContents(kResultBucketId, data, image_size);
1535 helper_->CompressedTexImage2DBucket( 1565 helper_->CompressedTexImage2DBucket(
1536 target, level, internalformat, width, height, border, kResultBucketId); 1566 target, level, internalformat, width, height, border, kResultBucketId);
1537 // Free the bucket. This is not required but it does free up the memory. 1567 // Free the bucket. This is not required but it does free up the memory.
1538 // and we don't have to wait for the result so from the client's perspective 1568 // and we don't have to wait for the result so from the client's perspective
1539 // it's cheap. 1569 // it's cheap.
1540 helper_->SetBucketSize(kResultBucketId, 0); 1570 helper_->SetBucketSize(kResultBucketId, 0);
1541 } 1571 }
1542 1572
1543 void GLES2Implementation::CompressedTexSubImage2D( 1573 void GLES2Implementation::CompressedTexSubImage2D(
1544 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 1574 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
1545 GLsizei height, GLenum format, GLsizei image_size, const void* data) { 1575 GLsizei height, GLenum format, GLsizei image_size, const void* data) {
1576 GPU_CLIENT_SINGLE_THREAD_CHECK();
1546 GPU_CLIENT_LOG("[" << this << "] glCompressedTexSubImage2D(" 1577 GPU_CLIENT_LOG("[" << this << "] glCompressedTexSubImage2D("
1547 << GLES2Util::GetStringTextureTarget(target) << ", " 1578 << GLES2Util::GetStringTextureTarget(target) << ", "
1548 << level << ", " 1579 << level << ", "
1549 << xoffset << ", " << yoffset << ", " 1580 << xoffset << ", " << yoffset << ", "
1550 << width << ", " << height << ", " 1581 << width << ", " << height << ", "
1551 << GLES2Util::GetStringCompressedTextureFormat(format) << ", " 1582 << GLES2Util::GetStringCompressedTextureFormat(format) << ", "
1552 << image_size << ", " 1583 << image_size << ", "
1553 << static_cast<const void*>(data) << ")"); 1584 << static_cast<const void*>(data) << ")");
1554 if (width < 0 || height < 0 || level < 0) { 1585 if (width < 0 || height < 0 || level < 0) {
1555 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D dimension < 0"); 1586 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D dimension < 0");
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 dest -= padded_row_size; 1631 dest -= padded_row_size;
1601 source += padded_row_size; 1632 source += padded_row_size;
1602 } 1633 }
1603 return true; 1634 return true;
1604 } 1635 }
1605 1636
1606 void GLES2Implementation::TexImage2D( 1637 void GLES2Implementation::TexImage2D(
1607 GLenum target, GLint level, GLint internalformat, GLsizei width, 1638 GLenum target, GLint level, GLint internalformat, GLsizei width,
1608 GLsizei height, GLint border, GLenum format, GLenum type, 1639 GLsizei height, GLint border, GLenum format, GLenum type,
1609 const void* pixels) { 1640 const void* pixels) {
1641 GPU_CLIENT_SINGLE_THREAD_CHECK();
1610 GPU_CLIENT_LOG("[" << this << "] glTexImage2D(" 1642 GPU_CLIENT_LOG("[" << this << "] glTexImage2D("
1611 << GLES2Util::GetStringTextureTarget(target) << ", " 1643 << GLES2Util::GetStringTextureTarget(target) << ", "
1612 << level << ", " 1644 << level << ", "
1613 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " 1645 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
1614 << width << ", " << height << ", " << border << ", " 1646 << width << ", " << height << ", " << border << ", "
1615 << GLES2Util::GetStringTextureFormat(format) << ", " 1647 << GLES2Util::GetStringTextureFormat(format) << ", "
1616 << GLES2Util::GetStringPixelType(type) << ", " 1648 << GLES2Util::GetStringPixelType(type) << ", "
1617 << static_cast<const void*>(pixels) << ")"); 1649 << static_cast<const void*>(pixels) << ")");
1618 if (level < 0 || height < 0 || width < 0) { 1650 if (level < 0 || height < 0 || width < 0) {
1619 SetGLError(GL_INVALID_VALUE, "glTexImage2D dimension < 0"); 1651 SetGLError(GL_INVALID_VALUE, "glTexImage2D dimension < 0");
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 helper_->TexImage2D( 1686 helper_->TexImage2D(
1655 target, level, internalformat, width, height, border, format, type, 1687 target, level, internalformat, width, height, border, format, type,
1656 transfer_buffer->GetShmId(), transfer_buffer->GetOffset(buffer)); 1688 transfer_buffer->GetShmId(), transfer_buffer->GetOffset(buffer));
1657 } 1689 }
1658 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken()); 1690 transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
1659 } 1691 }
1660 1692
1661 void GLES2Implementation::TexSubImage2D( 1693 void GLES2Implementation::TexSubImage2D(
1662 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 1694 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
1663 GLsizei height, GLenum format, GLenum type, const void* pixels) { 1695 GLsizei height, GLenum format, GLenum type, const void* pixels) {
1696 GPU_CLIENT_SINGLE_THREAD_CHECK();
1664 GPU_CLIENT_LOG("[" << this << "] glTexSubImage2D(" 1697 GPU_CLIENT_LOG("[" << this << "] glTexSubImage2D("
1665 << GLES2Util::GetStringTextureTarget(target) << ", " 1698 << GLES2Util::GetStringTextureTarget(target) << ", "
1666 << level << ", " 1699 << level << ", "
1667 << xoffset << ", " << yoffset << ", " 1700 << xoffset << ", " << yoffset << ", "
1668 << width << ", " << height << ", " 1701 << width << ", " << height << ", "
1669 << GLES2Util::GetStringTextureFormat(format) << ", " 1702 << GLES2Util::GetStringTextureFormat(format) << ", "
1670 << GLES2Util::GetStringPixelType(type) << ", " 1703 << GLES2Util::GetStringPixelType(type) << ", "
1671 << static_cast<const void*>(pixels) << ")"); 1704 << static_cast<const void*>(pixels) << ")");
1672 TexSubImage2DImpl( 1705 TexSubImage2DImpl(
1673 target, level, xoffset, yoffset, width, height, format, type, pixels, 1706 target, level, xoffset, yoffset, width, height, format, type, pixels,
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 name[max_size] = '\0'; 1834 name[max_size] = '\0';
1802 } 1835 }
1803 } 1836 }
1804 } 1837 }
1805 return result->success != 0; 1838 return result->success != 0;
1806 } 1839 }
1807 1840
1808 void GLES2Implementation::GetActiveAttrib( 1841 void GLES2Implementation::GetActiveAttrib(
1809 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, 1842 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
1810 GLenum* type, char* name) { 1843 GLenum* type, char* name) {
1844 GPU_CLIENT_SINGLE_THREAD_CHECK();
1811 GPU_CLIENT_LOG("[" << this << "] glGetActiveAttrib(" 1845 GPU_CLIENT_LOG("[" << this << "] glGetActiveAttrib("
1812 << program << ", " << index << ", " << bufsize << ", " 1846 << program << ", " << index << ", " << bufsize << ", "
1813 << static_cast<const void*>(length) << ", " 1847 << static_cast<const void*>(length) << ", "
1814 << static_cast<const void*>(size) << ", " 1848 << static_cast<const void*>(size) << ", "
1815 << static_cast<const void*>(type) << ", " 1849 << static_cast<const void*>(type) << ", "
1816 << static_cast<const void*>(name) << ", "); 1850 << static_cast<const void*>(name) << ", ");
1817 if (bufsize < 0) { 1851 if (bufsize < 0) {
1818 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); 1852 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0");
1819 return; 1853 return;
1820 } 1854 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 name[max_size] = '\0'; 1901 name[max_size] = '\0';
1868 } 1902 }
1869 } 1903 }
1870 } 1904 }
1871 return result->success != 0; 1905 return result->success != 0;
1872 } 1906 }
1873 1907
1874 void GLES2Implementation::GetActiveUniform( 1908 void GLES2Implementation::GetActiveUniform(
1875 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, 1909 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
1876 GLenum* type, char* name) { 1910 GLenum* type, char* name) {
1911 GPU_CLIENT_SINGLE_THREAD_CHECK();
1877 GPU_CLIENT_LOG("[" << this << "] glGetActiveUniform(" 1912 GPU_CLIENT_LOG("[" << this << "] glGetActiveUniform("
1878 << program << ", " << index << ", " << bufsize << ", " 1913 << program << ", " << index << ", " << bufsize << ", "
1879 << static_cast<const void*>(length) << ", " 1914 << static_cast<const void*>(length) << ", "
1880 << static_cast<const void*>(size) << ", " 1915 << static_cast<const void*>(size) << ", "
1881 << static_cast<const void*>(type) << ", " 1916 << static_cast<const void*>(type) << ", "
1882 << static_cast<const void*>(name) << ", "); 1917 << static_cast<const void*>(name) << ", ");
1883 if (bufsize < 0) { 1918 if (bufsize < 0) {
1884 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); 1919 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0");
1885 return; 1920 return;
1886 } 1921 }
1887 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); 1922 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform");
1888 bool success = program_info_manager_->GetActiveUniform( 1923 bool success = program_info_manager_->GetActiveUniform(
1889 this, program, index, bufsize, length, size, type, name); 1924 this, program, index, bufsize, length, size, type, name);
1890 if (success) { 1925 if (success) {
1891 if (size) { 1926 if (size) {
1892 GPU_CLIENT_LOG(" size: " << *size); 1927 GPU_CLIENT_LOG(" size: " << *size);
1893 } 1928 }
1894 if (type) { 1929 if (type) {
1895 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); 1930 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type));
1896 } 1931 }
1897 if (name) { 1932 if (name) {
1898 GPU_CLIENT_LOG(" name: " << name); 1933 GPU_CLIENT_LOG(" name: " << name);
1899 } 1934 }
1900 } 1935 }
1901 } 1936 }
1902 1937
1903 void GLES2Implementation::GetAttachedShaders( 1938 void GLES2Implementation::GetAttachedShaders(
1904 GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { 1939 GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) {
1940 GPU_CLIENT_SINGLE_THREAD_CHECK();
1905 GPU_CLIENT_LOG("[" << this << "] glGetAttachedShaders(" 1941 GPU_CLIENT_LOG("[" << this << "] glGetAttachedShaders("
1906 << program << ", " << maxcount << ", " 1942 << program << ", " << maxcount << ", "
1907 << static_cast<const void*>(count) << ", " 1943 << static_cast<const void*>(count) << ", "
1908 << static_cast<const void*>(shaders) << ", "); 1944 << static_cast<const void*>(shaders) << ", ");
1909 if (maxcount < 0) { 1945 if (maxcount < 0) {
1910 SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: maxcount < 0"); 1946 SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: maxcount < 0");
1911 return; 1947 return;
1912 } 1948 }
1913 TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders"); 1949 TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders");
1914 typedef gles2::GetAttachedShaders::Result Result; 1950 typedef gles2::GetAttachedShaders::Result Result;
(...skipping 15 matching lines...) Expand all
1930 GPU_CLIENT_LOG_CODE_BLOCK({ 1966 GPU_CLIENT_LOG_CODE_BLOCK({
1931 for (int32 i = 0; i < result->GetNumResults(); ++i) { 1967 for (int32 i = 0; i < result->GetNumResults(); ++i) {
1932 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); 1968 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
1933 } 1969 }
1934 }); 1970 });
1935 transfer_buffer->FreePendingToken(result, token); 1971 transfer_buffer->FreePendingToken(result, token);
1936 } 1972 }
1937 1973
1938 void GLES2Implementation::GetShaderPrecisionFormat( 1974 void GLES2Implementation::GetShaderPrecisionFormat(
1939 GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { 1975 GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) {
1976 GPU_CLIENT_SINGLE_THREAD_CHECK();
1940 GPU_CLIENT_LOG("[" << this << "] glGetShaderPrecisionFormat(" 1977 GPU_CLIENT_LOG("[" << this << "] glGetShaderPrecisionFormat("
1941 << GLES2Util::GetStringShaderType(shadertype) << ", " 1978 << GLES2Util::GetStringShaderType(shadertype) << ", "
1942 << GLES2Util::GetStringShaderPrecision(precisiontype) << ", " 1979 << GLES2Util::GetStringShaderPrecision(precisiontype) << ", "
1943 << static_cast<const void*>(range) << ", " 1980 << static_cast<const void*>(range) << ", "
1944 << static_cast<const void*>(precision) << ", "); 1981 << static_cast<const void*>(precision) << ", ");
1945 TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat"); 1982 TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat");
1946 typedef gles2::GetShaderPrecisionFormat::Result Result; 1983 typedef gles2::GetShaderPrecisionFormat::Result Result;
1947 Result* result = GetResultAs<Result*>(); 1984 Result* result = GetResultAs<Result*>();
1948 result->success = false; 1985 result->success = false;
1949 helper_->GetShaderPrecisionFormat( 1986 helper_->GetShaderPrecisionFormat(
1950 shadertype, precisiontype, GetResultShmId(), GetResultShmOffset()); 1987 shadertype, precisiontype, GetResultShmId(), GetResultShmOffset());
1951 WaitForCmd(); 1988 WaitForCmd();
1952 if (result->success) { 1989 if (result->success) {
1953 if (range) { 1990 if (range) {
1954 range[0] = result->min_range; 1991 range[0] = result->min_range;
1955 range[1] = result->max_range; 1992 range[1] = result->max_range;
1956 GPU_CLIENT_LOG(" min_range: " << range[0]); 1993 GPU_CLIENT_LOG(" min_range: " << range[0]);
1957 GPU_CLIENT_LOG(" min_range: " << range[1]); 1994 GPU_CLIENT_LOG(" min_range: " << range[1]);
1958 } 1995 }
1959 if (precision) { 1996 if (precision) {
1960 precision[0] = result->precision; 1997 precision[0] = result->precision;
1961 GPU_CLIENT_LOG(" min_range: " << precision[0]); 1998 GPU_CLIENT_LOG(" min_range: " << precision[0]);
1962 } 1999 }
1963 } 2000 }
1964 } 2001 }
1965 2002
1966 const GLubyte* GLES2Implementation::GetString(GLenum name) { 2003 const GLubyte* GLES2Implementation::GetString(GLenum name) {
2004 GPU_CLIENT_SINGLE_THREAD_CHECK();
1967 GPU_CLIENT_LOG("[" << this << "] glGetString(" 2005 GPU_CLIENT_LOG("[" << this << "] glGetString("
1968 << GLES2Util::GetStringStringType(name) << ")"); 2006 << GLES2Util::GetStringStringType(name) << ")");
1969 const char* result = NULL; 2007 const char* result = NULL;
1970 // Clears the bucket so if the command fails nothing will be in it. 2008 // Clears the bucket so if the command fails nothing will be in it.
1971 helper_->SetBucketSize(kResultBucketId, 0); 2009 helper_->SetBucketSize(kResultBucketId, 0);
1972 helper_->GetString(name, kResultBucketId); 2010 helper_->GetString(name, kResultBucketId);
1973 std::string str; 2011 std::string str;
1974 if (GetBucketAsString(kResultBucketId, &str)) { 2012 if (GetBucketAsString(kResultBucketId, &str)) {
1975 // Adds extensions implemented on client side only. 2013 // Adds extensions implemented on client side only.
1976 switch (name) { 2014 switch (name) {
(...skipping 27 matching lines...) Expand all
2004 GPU_DCHECK(insert_result.second); 2042 GPU_DCHECK(insert_result.second);
2005 result = insert_result.first->c_str(); 2043 result = insert_result.first->c_str();
2006 } 2044 }
2007 } 2045 }
2008 GPU_CLIENT_LOG(" returned " << static_cast<const char*>(result)); 2046 GPU_CLIENT_LOG(" returned " << static_cast<const char*>(result));
2009 return reinterpret_cast<const GLubyte*>(result); 2047 return reinterpret_cast<const GLubyte*>(result);
2010 } 2048 }
2011 2049
2012 void GLES2Implementation::GetUniformfv( 2050 void GLES2Implementation::GetUniformfv(
2013 GLuint program, GLint location, GLfloat* params) { 2051 GLuint program, GLint location, GLfloat* params) {
2052 GPU_CLIENT_SINGLE_THREAD_CHECK();
2014 GPU_CLIENT_LOG("[" << this << "] glGetUniformfv(" 2053 GPU_CLIENT_LOG("[" << this << "] glGetUniformfv("
2015 << program << ", " << location << ", " 2054 << program << ", " << location << ", "
2016 << static_cast<const void*>(params) << ")"); 2055 << static_cast<const void*>(params) << ")");
2017 TRACE_EVENT0("gpu", "GLES2::GetUniformfv"); 2056 TRACE_EVENT0("gpu", "GLES2::GetUniformfv");
2018 typedef gles2::GetUniformfv::Result Result; 2057 typedef gles2::GetUniformfv::Result Result;
2019 Result* result = GetResultAs<Result*>(); 2058 Result* result = GetResultAs<Result*>();
2020 result->SetNumResults(0); 2059 result->SetNumResults(0);
2021 helper_->GetUniformfv( 2060 helper_->GetUniformfv(
2022 program, location, GetResultShmId(), GetResultShmOffset()); 2061 program, location, GetResultShmId(), GetResultShmOffset());
2023 WaitForCmd(); 2062 WaitForCmd();
2024 result->CopyResult(params); 2063 result->CopyResult(params);
2025 GPU_CLIENT_LOG_CODE_BLOCK({ 2064 GPU_CLIENT_LOG_CODE_BLOCK({
2026 for (int32 i = 0; i < result->GetNumResults(); ++i) { 2065 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2027 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); 2066 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2028 } 2067 }
2029 }); 2068 });
2030 } 2069 }
2031 2070
2032 void GLES2Implementation::GetUniformiv( 2071 void GLES2Implementation::GetUniformiv(
2033 GLuint program, GLint location, GLint* params) { 2072 GLuint program, GLint location, GLint* params) {
2073 GPU_CLIENT_SINGLE_THREAD_CHECK();
2034 GPU_CLIENT_LOG("[" << this << "] glGetUniformiv(" 2074 GPU_CLIENT_LOG("[" << this << "] glGetUniformiv("
2035 << program << ", " << location << ", " 2075 << program << ", " << location << ", "
2036 << static_cast<const void*>(params) << ")"); 2076 << static_cast<const void*>(params) << ")");
2037 TRACE_EVENT0("gpu", "GLES2::GetUniformiv"); 2077 TRACE_EVENT0("gpu", "GLES2::GetUniformiv");
2038 typedef gles2::GetUniformiv::Result Result; 2078 typedef gles2::GetUniformiv::Result Result;
2039 Result* result = GetResultAs<Result*>(); 2079 Result* result = GetResultAs<Result*>();
2040 result->SetNumResults(0); 2080 result->SetNumResults(0);
2041 helper_->GetUniformiv( 2081 helper_->GetUniformiv(
2042 program, location, GetResultShmId(), GetResultShmOffset()); 2082 program, location, GetResultShmId(), GetResultShmOffset());
2043 WaitForCmd(); 2083 WaitForCmd();
2044 GetResultAs<gles2::GetUniformfv::Result*>()->CopyResult(params); 2084 GetResultAs<gles2::GetUniformfv::Result*>()->CopyResult(params);
2045 GPU_CLIENT_LOG_CODE_BLOCK({ 2085 GPU_CLIENT_LOG_CODE_BLOCK({
2046 for (int32 i = 0; i < result->GetNumResults(); ++i) { 2086 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2047 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); 2087 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2048 } 2088 }
2049 }); 2089 });
2050 } 2090 }
2051 2091
2052 void GLES2Implementation::ReadPixels( 2092 void GLES2Implementation::ReadPixels(
2053 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, 2093 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
2054 GLenum type, void* pixels) { 2094 GLenum type, void* pixels) {
2095 GPU_CLIENT_SINGLE_THREAD_CHECK();
2055 GPU_CLIENT_LOG("[" << this << "] glReadPixels(" 2096 GPU_CLIENT_LOG("[" << this << "] glReadPixels("
2056 << xoffset << ", " << yoffset << ", " 2097 << xoffset << ", " << yoffset << ", "
2057 << width << ", " << height << ", " 2098 << width << ", " << height << ", "
2058 << GLES2Util::GetStringReadPixelFormat(format) << ", " 2099 << GLES2Util::GetStringReadPixelFormat(format) << ", "
2059 << GLES2Util::GetStringPixelType(type) << ", " 2100 << GLES2Util::GetStringPixelType(type) << ", "
2060 << static_cast<const void*>(pixels) << ")"); 2101 << static_cast<const void*>(pixels) << ")");
2061 if (width < 0 || height < 0) { 2102 if (width < 0 || height < 0) {
2062 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0"); 2103 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0");
2063 return; 2104 return;
2064 } 2105 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2182 temp_xoffset += num_pixels; 2223 temp_xoffset += num_pixels;
2183 temp_width -= num_pixels; 2224 temp_width -= num_pixels;
2184 } 2225 }
2185 ++yoffset; 2226 ++yoffset;
2186 dest += pack_reverse_row_order_ ? -padded_row_size : padded_row_size; 2227 dest += pack_reverse_row_order_ ? -padded_row_size : padded_row_size;
2187 } 2228 }
2188 } 2229 }
2189 } 2230 }
2190 2231
2191 void GLES2Implementation::ActiveTexture(GLenum texture) { 2232 void GLES2Implementation::ActiveTexture(GLenum texture) {
2233 GPU_CLIENT_SINGLE_THREAD_CHECK();
2192 GPU_CLIENT_LOG("[" << this << "] glActiveTexture(" 2234 GPU_CLIENT_LOG("[" << this << "] glActiveTexture("
2193 << GLES2Util::GetStringEnum(texture) << ")"); 2235 << GLES2Util::GetStringEnum(texture) << ")");
2194 GLuint texture_index = texture - GL_TEXTURE0; 2236 GLuint texture_index = texture - GL_TEXTURE0;
2195 if (texture_index >= 2237 if (texture_index >=
2196 static_cast<GLuint>(gl_state_.max_combined_texture_image_units)) { 2238 static_cast<GLuint>(gl_state_.max_combined_texture_image_units)) {
2197 SetGLError(GL_INVALID_ENUM, "glActiveTexture: texture_unit out of range."); 2239 SetGLError(GL_INVALID_ENUM, "glActiveTexture: texture_unit out of range.");
2198 return; 2240 return;
2199 } 2241 }
2200 2242
2201 active_texture_unit_ = texture_index; 2243 active_texture_unit_ = texture_index;
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
2357 } 2399 }
2358 if (textures[ii] == unit.bound_texture_cube_map) { 2400 if (textures[ii] == unit.bound_texture_cube_map) {
2359 unit.bound_texture_cube_map = 0; 2401 unit.bound_texture_cube_map = 0;
2360 } 2402 }
2361 } 2403 }
2362 } 2404 }
2363 helper_->DeleteTexturesImmediate(n, textures); 2405 helper_->DeleteTexturesImmediate(n, textures);
2364 } 2406 }
2365 2407
2366 void GLES2Implementation::DisableVertexAttribArray(GLuint index) { 2408 void GLES2Implementation::DisableVertexAttribArray(GLuint index) {
2409 GPU_CLIENT_SINGLE_THREAD_CHECK();
2367 GPU_CLIENT_LOG( 2410 GPU_CLIENT_LOG(
2368 "[" << this << "] glDisableVertexAttribArray(" << index << ")"); 2411 "[" << this << "] glDisableVertexAttribArray(" << index << ")");
2369 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 2412 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
2370 client_side_buffer_helper_->SetAttribEnable(index, false); 2413 client_side_buffer_helper_->SetAttribEnable(index, false);
2371 #endif 2414 #endif
2372 helper_->DisableVertexAttribArray(index); 2415 helper_->DisableVertexAttribArray(index);
2373 } 2416 }
2374 2417
2375 void GLES2Implementation::EnableVertexAttribArray(GLuint index) { 2418 void GLES2Implementation::EnableVertexAttribArray(GLuint index) {
2419 GPU_CLIENT_SINGLE_THREAD_CHECK();
2376 GPU_CLIENT_LOG("[" << this << "] glEnableVertexAttribArray(" << index << ")"); 2420 GPU_CLIENT_LOG("[" << this << "] glEnableVertexAttribArray(" << index << ")");
2377 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 2421 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
2378 client_side_buffer_helper_->SetAttribEnable(index, true); 2422 client_side_buffer_helper_->SetAttribEnable(index, true);
2379 #endif 2423 #endif
2380 helper_->EnableVertexAttribArray(index); 2424 helper_->EnableVertexAttribArray(index);
2381 } 2425 }
2382 2426
2383 void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) { 2427 void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) {
2428 GPU_CLIENT_SINGLE_THREAD_CHECK();
2384 GPU_CLIENT_LOG("[" << this << "] glDrawArrays(" 2429 GPU_CLIENT_LOG("[" << this << "] glDrawArrays("
2385 << GLES2Util::GetStringDrawMode(mode) << ", " 2430 << GLES2Util::GetStringDrawMode(mode) << ", "
2386 << first << ", " << count << ")"); 2431 << first << ", " << count << ")");
2387 if (count < 0) { 2432 if (count < 0) {
2388 SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0"); 2433 SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0");
2389 return; 2434 return;
2390 } 2435 }
2391 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 2436 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
2392 bool have_client_side = 2437 bool have_client_side =
2393 client_side_buffer_helper_->HaveEnabledClientSideBuffers(); 2438 client_side_buffer_helper_->HaveEnabledClientSideBuffers();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2438 default: 2483 default:
2439 SetGLError(GL_INVALID_ENUM, "glGetVertexAttrib: invalid enum"); 2484 SetGLError(GL_INVALID_ENUM, "glGetVertexAttrib: invalid enum");
2440 break; 2485 break;
2441 } 2486 }
2442 return true; 2487 return true;
2443 } 2488 }
2444 #endif // GLES2_SUPPORT_CLIENT_SIDE_ARRAYS 2489 #endif // GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
2445 2490
2446 void GLES2Implementation::GetVertexAttribfv( 2491 void GLES2Implementation::GetVertexAttribfv(
2447 GLuint index, GLenum pname, GLfloat* params) { 2492 GLuint index, GLenum pname, GLfloat* params) {
2493 GPU_CLIENT_SINGLE_THREAD_CHECK();
2448 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribfv(" 2494 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribfv("
2449 << index << ", " 2495 << index << ", "
2450 << GLES2Util::GetStringVertexAttribute(pname) << ", " 2496 << GLES2Util::GetStringVertexAttribute(pname) << ", "
2451 << static_cast<const void*>(params) << ")"); 2497 << static_cast<const void*>(params) << ")");
2452 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 2498 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
2453 uint32 value = 0; 2499 uint32 value = 0;
2454 if (GetVertexAttribHelper(index, pname, &value)) { 2500 if (GetVertexAttribHelper(index, pname, &value)) {
2455 *params = static_cast<float>(value); 2501 *params = static_cast<float>(value);
2456 return; 2502 return;
2457 } 2503 }
2458 #endif 2504 #endif
2459 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribfv"); 2505 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribfv");
2460 typedef GetVertexAttribfv::Result Result; 2506 typedef GetVertexAttribfv::Result Result;
2461 Result* result = GetResultAs<Result*>(); 2507 Result* result = GetResultAs<Result*>();
2462 result->SetNumResults(0); 2508 result->SetNumResults(0);
2463 helper_->GetVertexAttribfv( 2509 helper_->GetVertexAttribfv(
2464 index, pname, GetResultShmId(), GetResultShmOffset()); 2510 index, pname, GetResultShmId(), GetResultShmOffset());
2465 WaitForCmd(); 2511 WaitForCmd();
2466 result->CopyResult(params); 2512 result->CopyResult(params);
2467 GPU_CLIENT_LOG_CODE_BLOCK({ 2513 GPU_CLIENT_LOG_CODE_BLOCK({
2468 for (int32 i = 0; i < result->GetNumResults(); ++i) { 2514 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2469 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); 2515 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2470 } 2516 }
2471 }); 2517 });
2472 } 2518 }
2473 2519
2474 void GLES2Implementation::GetVertexAttribiv( 2520 void GLES2Implementation::GetVertexAttribiv(
2475 GLuint index, GLenum pname, GLint* params) { 2521 GLuint index, GLenum pname, GLint* params) {
2522 GPU_CLIENT_SINGLE_THREAD_CHECK();
2476 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribiv(" 2523 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribiv("
2477 << index << ", " 2524 << index << ", "
2478 << GLES2Util::GetStringVertexAttribute(pname) << ", " 2525 << GLES2Util::GetStringVertexAttribute(pname) << ", "
2479 << static_cast<const void*>(params) << ")"); 2526 << static_cast<const void*>(params) << ")");
2480 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 2527 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
2481 uint32 value = 0; 2528 uint32 value = 0;
2482 if (GetVertexAttribHelper(index, pname, &value)) { 2529 if (GetVertexAttribHelper(index, pname, &value)) {
2483 *params = value; 2530 *params = value;
2484 return; 2531 return;
2485 } 2532 }
2486 #endif 2533 #endif
2487 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribiv"); 2534 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribiv");
2488 typedef GetVertexAttribiv::Result Result; 2535 typedef GetVertexAttribiv::Result Result;
2489 Result* result = GetResultAs<Result*>(); 2536 Result* result = GetResultAs<Result*>();
2490 result->SetNumResults(0); 2537 result->SetNumResults(0);
2491 helper_->GetVertexAttribiv( 2538 helper_->GetVertexAttribiv(
2492 index, pname, GetResultShmId(), GetResultShmOffset()); 2539 index, pname, GetResultShmId(), GetResultShmOffset());
2493 WaitForCmd(); 2540 WaitForCmd();
2494 result->CopyResult(params); 2541 result->CopyResult(params);
2495 GPU_CLIENT_LOG_CODE_BLOCK({ 2542 GPU_CLIENT_LOG_CODE_BLOCK({
2496 for (int32 i = 0; i < result->GetNumResults(); ++i) { 2543 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2497 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); 2544 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2498 } 2545 }
2499 }); 2546 });
2500 } 2547 }
2501 2548
2502 GLboolean GLES2Implementation::EnableFeatureCHROMIUM( 2549 GLboolean GLES2Implementation::EnableFeatureCHROMIUM(
2503 const char* feature) { 2550 const char* feature) {
2551 GPU_CLIENT_SINGLE_THREAD_CHECK();
2504 GPU_CLIENT_LOG("[" << this << "] glEnableFeatureCHROMIUM(" 2552 GPU_CLIENT_LOG("[" << this << "] glEnableFeatureCHROMIUM("
2505 << feature << ")"); 2553 << feature << ")");
2506 TRACE_EVENT0("gpu", "GLES2::EnableFeatureCHROMIUM"); 2554 TRACE_EVENT0("gpu", "GLES2::EnableFeatureCHROMIUM");
2507 typedef EnableFeatureCHROMIUM::Result Result; 2555 typedef EnableFeatureCHROMIUM::Result Result;
2508 Result* result = GetResultAs<Result*>(); 2556 Result* result = GetResultAs<Result*>();
2509 *result = 0; 2557 *result = 0;
2510 SetBucketAsCString(kResultBucketId, feature); 2558 SetBucketAsCString(kResultBucketId, feature);
2511 helper_->EnableFeatureCHROMIUM( 2559 helper_->EnableFeatureCHROMIUM(
2512 kResultBucketId, GetResultShmId(), GetResultShmOffset()); 2560 kResultBucketId, GetResultShmId(), GetResultShmOffset());
2513 WaitForCmd(); 2561 WaitForCmd();
2514 helper_->SetBucketSize(kResultBucketId, 0); 2562 helper_->SetBucketSize(kResultBucketId, 0);
2515 GPU_CLIENT_LOG(" returned " << GLES2Util::GetStringBool(*result)); 2563 GPU_CLIENT_LOG(" returned " << GLES2Util::GetStringBool(*result));
2516 return *result; 2564 return *result;
2517 } 2565 }
2518 2566
2519 void* GLES2Implementation::MapBufferSubDataCHROMIUM( 2567 void* GLES2Implementation::MapBufferSubDataCHROMIUM(
2520 GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { 2568 GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) {
2569 GPU_CLIENT_SINGLE_THREAD_CHECK();
2521 GPU_CLIENT_LOG("[" << this << "] glMapBufferSubDataCHROMIUM(" 2570 GPU_CLIENT_LOG("[" << this << "] glMapBufferSubDataCHROMIUM("
2522 << target << ", " << offset << ", " << size << ", " 2571 << target << ", " << offset << ", " << size << ", "
2523 << GLES2Util::GetStringEnum(access) << ")"); 2572 << GLES2Util::GetStringEnum(access) << ")");
2524 // NOTE: target is NOT checked because the service will check it 2573 // NOTE: target is NOT checked because the service will check it
2525 // and we don't know what targets are valid. 2574 // and we don't know what targets are valid.
2526 if (access != GL_WRITE_ONLY) { 2575 if (access != GL_WRITE_ONLY) {
2527 SetGLError(GL_INVALID_ENUM, "MapBufferSubDataCHROMIUM: bad access mode"); 2576 SetGLError(GL_INVALID_ENUM, "MapBufferSubDataCHROMIUM: bad access mode");
2528 return NULL; 2577 return NULL;
2529 } 2578 }
2530 if (offset < 0 || size < 0) { 2579 if (offset < 0 || size < 0) {
(...skipping 12 matching lines...) Expand all
2543 mapped_buffers_.insert(std::make_pair( 2592 mapped_buffers_.insert(std::make_pair(
2544 mem, 2593 mem,
2545 MappedBuffer( 2594 MappedBuffer(
2546 access, shm_id, mem, shm_offset, target, offset, size))); 2595 access, shm_id, mem, shm_offset, target, offset, size)));
2547 GPU_DCHECK(result.second); 2596 GPU_DCHECK(result.second);
2548 GPU_CLIENT_LOG(" returned " << mem); 2597 GPU_CLIENT_LOG(" returned " << mem);
2549 return mem; 2598 return mem;
2550 } 2599 }
2551 2600
2552 void GLES2Implementation::UnmapBufferSubDataCHROMIUM(const void* mem) { 2601 void GLES2Implementation::UnmapBufferSubDataCHROMIUM(const void* mem) {
2602 GPU_CLIENT_SINGLE_THREAD_CHECK();
2553 GPU_CLIENT_LOG( 2603 GPU_CLIENT_LOG(
2554 "[" << this << "] glUnmapBufferSubDataCHROMIUM(" << mem << ")"); 2604 "[" << this << "] glUnmapBufferSubDataCHROMIUM(" << mem << ")");
2555 MappedBufferMap::iterator it = mapped_buffers_.find(mem); 2605 MappedBufferMap::iterator it = mapped_buffers_.find(mem);
2556 if (it == mapped_buffers_.end()) { 2606 if (it == mapped_buffers_.end()) {
2557 SetGLError( 2607 SetGLError(
2558 GL_INVALID_VALUE, "UnmapBufferSubDataCHROMIUM: buffer not mapped"); 2608 GL_INVALID_VALUE, "UnmapBufferSubDataCHROMIUM: buffer not mapped");
2559 return; 2609 return;
2560 } 2610 }
2561 const MappedBuffer& mb = it->second; 2611 const MappedBuffer& mb = it->second;
2562 helper_->BufferSubData( 2612 helper_->BufferSubData(
2563 mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset); 2613 mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset);
2564 mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken()); 2614 mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken());
2565 helper_->CommandBufferHelper::Flush(); 2615 helper_->CommandBufferHelper::Flush();
2566 mapped_buffers_.erase(it); 2616 mapped_buffers_.erase(it);
2567 } 2617 }
2568 2618
2569 void* GLES2Implementation::MapTexSubImage2DCHROMIUM( 2619 void* GLES2Implementation::MapTexSubImage2DCHROMIUM(
2570 GLenum target, 2620 GLenum target,
2571 GLint level, 2621 GLint level,
2572 GLint xoffset, 2622 GLint xoffset,
2573 GLint yoffset, 2623 GLint yoffset,
2574 GLsizei width, 2624 GLsizei width,
2575 GLsizei height, 2625 GLsizei height,
2576 GLenum format, 2626 GLenum format,
2577 GLenum type, 2627 GLenum type,
2578 GLenum access) { 2628 GLenum access) {
2629 GPU_CLIENT_SINGLE_THREAD_CHECK();
2579 GPU_CLIENT_LOG("[" << this << "] glMapTexSubImage2DCHROMIUM(" 2630 GPU_CLIENT_LOG("[" << this << "] glMapTexSubImage2DCHROMIUM("
2580 << target << ", " << level << ", " 2631 << target << ", " << level << ", "
2581 << xoffset << ", " << yoffset << ", " 2632 << xoffset << ", " << yoffset << ", "
2582 << width << ", " << height << ", " 2633 << width << ", " << height << ", "
2583 << GLES2Util::GetStringTextureFormat(format) << ", " 2634 << GLES2Util::GetStringTextureFormat(format) << ", "
2584 << GLES2Util::GetStringPixelType(type) << ", " 2635 << GLES2Util::GetStringPixelType(type) << ", "
2585 << GLES2Util::GetStringEnum(access) << ")"); 2636 << GLES2Util::GetStringEnum(access) << ")");
2586 if (access != GL_WRITE_ONLY) { 2637 if (access != GL_WRITE_ONLY) {
2587 SetGLError(GL_INVALID_ENUM, "MapTexSubImage2DCHROMIUM: bad access mode"); 2638 SetGLError(GL_INVALID_ENUM, "MapTexSubImage2DCHROMIUM: bad access mode");
2588 return NULL; 2639 return NULL;
(...skipping 24 matching lines...) Expand all
2613 mem, 2664 mem,
2614 MappedTexture( 2665 MappedTexture(
2615 access, shm_id, mem, shm_offset, 2666 access, shm_id, mem, shm_offset,
2616 target, level, xoffset, yoffset, width, height, format, type))); 2667 target, level, xoffset, yoffset, width, height, format, type)));
2617 GPU_DCHECK(result.second); 2668 GPU_DCHECK(result.second);
2618 GPU_CLIENT_LOG(" returned " << mem); 2669 GPU_CLIENT_LOG(" returned " << mem);
2619 return mem; 2670 return mem;
2620 } 2671 }
2621 2672
2622 void GLES2Implementation::UnmapTexSubImage2DCHROMIUM(const void* mem) { 2673 void GLES2Implementation::UnmapTexSubImage2DCHROMIUM(const void* mem) {
2674 GPU_CLIENT_SINGLE_THREAD_CHECK();
2623 GPU_CLIENT_LOG( 2675 GPU_CLIENT_LOG(
2624 "[" << this << "] glUnmapTexSubImage2DCHROMIUM(" << mem << ")"); 2676 "[" << this << "] glUnmapTexSubImage2DCHROMIUM(" << mem << ")");
2625 MappedTextureMap::iterator it = mapped_textures_.find(mem); 2677 MappedTextureMap::iterator it = mapped_textures_.find(mem);
2626 if (it == mapped_textures_.end()) { 2678 if (it == mapped_textures_.end()) {
2627 SetGLError( 2679 SetGLError(
2628 GL_INVALID_VALUE, "UnmapTexSubImage2DCHROMIUM: texture not mapped"); 2680 GL_INVALID_VALUE, "UnmapTexSubImage2DCHROMIUM: texture not mapped");
2629 return; 2681 return;
2630 } 2682 }
2631 const MappedTexture& mt = it->second; 2683 const MappedTexture& mt = it->second;
2632 helper_->TexSubImage2D( 2684 helper_->TexSubImage2D(
2633 mt.target, mt.level, mt.xoffset, mt.yoffset, mt.width, mt.height, 2685 mt.target, mt.level, mt.xoffset, mt.yoffset, mt.width, mt.height,
2634 mt.format, mt.type, mt.shm_id, mt.shm_offset, GL_FALSE); 2686 mt.format, mt.type, mt.shm_id, mt.shm_offset, GL_FALSE);
2635 mapped_memory_->FreePendingToken(mt.shm_memory, helper_->InsertToken()); 2687 mapped_memory_->FreePendingToken(mt.shm_memory, helper_->InsertToken());
2636 helper_->CommandBufferHelper::Flush(); 2688 helper_->CommandBufferHelper::Flush();
2637 mapped_textures_.erase(it); 2689 mapped_textures_.erase(it);
2638 } 2690 }
2639 2691
2640 void GLES2Implementation::ResizeCHROMIUM(GLuint width, GLuint height) { 2692 void GLES2Implementation::ResizeCHROMIUM(GLuint width, GLuint height) {
2693 GPU_CLIENT_SINGLE_THREAD_CHECK();
2641 GPU_CLIENT_LOG("[" << this << "] glResizeCHROMIUM(" 2694 GPU_CLIENT_LOG("[" << this << "] glResizeCHROMIUM("
2642 << width << ", " << height << ")"); 2695 << width << ", " << height << ")");
2643 helper_->ResizeCHROMIUM(width, height); 2696 helper_->ResizeCHROMIUM(width, height);
2644 } 2697 }
2645 2698
2646 const GLchar* GLES2Implementation::GetRequestableExtensionsCHROMIUM() { 2699 const GLchar* GLES2Implementation::GetRequestableExtensionsCHROMIUM() {
2700 GPU_CLIENT_SINGLE_THREAD_CHECK();
2647 GPU_CLIENT_LOG("[" << this << "] glGetRequestableExtensionsCHROMIUM()"); 2701 GPU_CLIENT_LOG("[" << this << "] glGetRequestableExtensionsCHROMIUM()");
2648 TRACE_EVENT0("gpu", 2702 TRACE_EVENT0("gpu",
2649 "GLES2Implementation::GetRequestableExtensionsCHROMIUM()"); 2703 "GLES2Implementation::GetRequestableExtensionsCHROMIUM()");
2650 const char* result = NULL; 2704 const char* result = NULL;
2651 // Clear the bucket so if the command fails nothing will be in it. 2705 // Clear the bucket so if the command fails nothing will be in it.
2652 helper_->SetBucketSize(kResultBucketId, 0); 2706 helper_->SetBucketSize(kResultBucketId, 0);
2653 helper_->GetRequestableExtensionsCHROMIUM(kResultBucketId); 2707 helper_->GetRequestableExtensionsCHROMIUM(kResultBucketId);
2654 std::string str; 2708 std::string str;
2655 if (GetBucketAsString(kResultBucketId, &str)) { 2709 if (GetBucketAsString(kResultBucketId, &str)) {
2656 // The set of requestable extensions shrinks as we enable 2710 // The set of requestable extensions shrinks as we enable
2657 // them. Because we don't know when the client will stop referring 2711 // them. Because we don't know when the client will stop referring
2658 // to a previous one it queries (see GetString) we need to cache 2712 // to a previous one it queries (see GetString) we need to cache
2659 // the unique results. 2713 // the unique results.
2660 std::set<std::string>::const_iterator sit = 2714 std::set<std::string>::const_iterator sit =
2661 requestable_extensions_set_.find(str); 2715 requestable_extensions_set_.find(str);
2662 if (sit != requestable_extensions_set_.end()) { 2716 if (sit != requestable_extensions_set_.end()) {
2663 result = sit->c_str(); 2717 result = sit->c_str();
2664 } else { 2718 } else {
2665 std::pair<std::set<std::string>::const_iterator, bool> insert_result = 2719 std::pair<std::set<std::string>::const_iterator, bool> insert_result =
2666 requestable_extensions_set_.insert(str); 2720 requestable_extensions_set_.insert(str);
2667 GPU_DCHECK(insert_result.second); 2721 GPU_DCHECK(insert_result.second);
2668 result = insert_result.first->c_str(); 2722 result = insert_result.first->c_str();
2669 } 2723 }
2670 } 2724 }
2671 GPU_CLIENT_LOG(" returned " << result); 2725 GPU_CLIENT_LOG(" returned " << result);
2672 return reinterpret_cast<const GLchar*>(result); 2726 return reinterpret_cast<const GLchar*>(result);
2673 } 2727 }
2674 2728
2675 void GLES2Implementation::RequestExtensionCHROMIUM(const char* extension) { 2729 void GLES2Implementation::RequestExtensionCHROMIUM(const char* extension) {
2730 GPU_CLIENT_SINGLE_THREAD_CHECK();
2676 GPU_CLIENT_LOG("[" << this << "] glRequestExtensionCHROMIUM(" 2731 GPU_CLIENT_LOG("[" << this << "] glRequestExtensionCHROMIUM("
2677 << extension << ")"); 2732 << extension << ")");
2678 SetBucketAsCString(kResultBucketId, extension); 2733 SetBucketAsCString(kResultBucketId, extension);
2679 helper_->RequestExtensionCHROMIUM(kResultBucketId); 2734 helper_->RequestExtensionCHROMIUM(kResultBucketId);
2680 helper_->SetBucketSize(kResultBucketId, 0); 2735 helper_->SetBucketSize(kResultBucketId, 0);
2681 if (kUnavailableExtensionStatus == angle_pack_reverse_row_order_status && 2736 if (kUnavailableExtensionStatus == angle_pack_reverse_row_order_status &&
2682 !strcmp(extension, "GL_ANGLE_pack_reverse_row_order")) { 2737 !strcmp(extension, "GL_ANGLE_pack_reverse_row_order")) {
2683 angle_pack_reverse_row_order_status = kUnknownExtensionStatus; 2738 angle_pack_reverse_row_order_status = kUnknownExtensionStatus;
2684 } 2739 }
2685 } 2740 }
2686 2741
2687 void GLES2Implementation::RateLimitOffscreenContextCHROMIUM() { 2742 void GLES2Implementation::RateLimitOffscreenContextCHROMIUM() {
2743 GPU_CLIENT_SINGLE_THREAD_CHECK();
2688 GPU_CLIENT_LOG("[" << this << "] glRateLimitOffscreenCHROMIUM()"); 2744 GPU_CLIENT_LOG("[" << this << "] glRateLimitOffscreenCHROMIUM()");
2689 // Wait if this would add too many rate limit tokens. 2745 // Wait if this would add too many rate limit tokens.
2690 if (rate_limit_tokens_.size() == kMaxSwapBuffers) { 2746 if (rate_limit_tokens_.size() == kMaxSwapBuffers) {
2691 helper_->WaitForToken(rate_limit_tokens_.front()); 2747 helper_->WaitForToken(rate_limit_tokens_.front());
2692 rate_limit_tokens_.pop(); 2748 rate_limit_tokens_.pop();
2693 } 2749 }
2694 rate_limit_tokens_.push(helper_->InsertToken()); 2750 rate_limit_tokens_.push(helper_->InsertToken());
2695 } 2751 }
2696 2752
2697 void GLES2Implementation::GetMultipleIntegervCHROMIUM( 2753 void GLES2Implementation::GetMultipleIntegervCHROMIUM(
2698 const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) { 2754 const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) {
2755 GPU_CLIENT_SINGLE_THREAD_CHECK();
2699 GPU_CLIENT_LOG("[" << this << "] glGetMultipleIntegervCHROMIUM(" 2756 GPU_CLIENT_LOG("[" << this << "] glGetMultipleIntegervCHROMIUM("
2700 << static_cast<const void*>(pnames) << ", " 2757 << static_cast<const void*>(pnames) << ", "
2701 << count << ", " << results << ", " << size << ")"); 2758 << count << ", " << results << ", " << size << ")");
2702 GPU_CLIENT_LOG_CODE_BLOCK({ 2759 GPU_CLIENT_LOG_CODE_BLOCK({
2703 for (GLuint i = 0; i < count; ++i) { 2760 for (GLuint i = 0; i < count; ++i) {
2704 GPU_CLIENT_LOG( 2761 GPU_CLIENT_LOG(
2705 " " << i << ": " << GLES2Util::GetStringGLState(pnames[i])); 2762 " " << i << ": " << GLES2Util::GetStringGLState(pnames[i]));
2706 } 2763 }
2707 }); 2764 });
2708 int num_results = 0; 2765 int num_results = 0;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2756 GLuint program, std::vector<int8>* result) { 2813 GLuint program, std::vector<int8>* result) {
2757 GPU_DCHECK(result); 2814 GPU_DCHECK(result);
2758 // Clear the bucket so if the command fails nothing will be in it. 2815 // Clear the bucket so if the command fails nothing will be in it.
2759 helper_->SetBucketSize(kResultBucketId, 0); 2816 helper_->SetBucketSize(kResultBucketId, 0);
2760 helper_->GetProgramInfoCHROMIUM(program, kResultBucketId); 2817 helper_->GetProgramInfoCHROMIUM(program, kResultBucketId);
2761 GetBucketContents(kResultBucketId, result); 2818 GetBucketContents(kResultBucketId, result);
2762 } 2819 }
2763 2820
2764 void GLES2Implementation::GetProgramInfoCHROMIUM( 2821 void GLES2Implementation::GetProgramInfoCHROMIUM(
2765 GLuint program, GLsizei bufsize, GLsizei* size, void* info) { 2822 GLuint program, GLsizei bufsize, GLsizei* size, void* info) {
2823 GPU_CLIENT_SINGLE_THREAD_CHECK();
2766 if (bufsize < 0) { 2824 if (bufsize < 0) {
2767 SetGLError(GL_INVALID_VALUE, "glProgramInfoCHROMIUM: bufsize less than 0."); 2825 SetGLError(GL_INVALID_VALUE, "glProgramInfoCHROMIUM: bufsize less than 0.");
2768 return; 2826 return;
2769 } 2827 }
2770 if (size == NULL) { 2828 if (size == NULL) {
2771 SetGLError(GL_INVALID_VALUE, "glProgramInfoCHROMIUM: size is null."); 2829 SetGLError(GL_INVALID_VALUE, "glProgramInfoCHROMIUM: size is null.");
2772 return; 2830 return;
2773 } 2831 }
2774 // Make sure they've set size to 0 else the value will be undefined on 2832 // Make sure they've set size to 0 else the value will be undefined on
2775 // lost context. 2833 // lost context.
2776 GPU_DCHECK(*size == 0); 2834 GPU_DCHECK(*size == 0);
2777 std::vector<int8> result; 2835 std::vector<int8> result;
2778 GetProgramInfoCHROMIUMHelper(program, &result); 2836 GetProgramInfoCHROMIUMHelper(program, &result);
2779 if (result.empty()) { 2837 if (result.empty()) {
2780 return; 2838 return;
2781 } 2839 }
2782 *size = result.size(); 2840 *size = result.size();
2783 if (!info) { 2841 if (!info) {
2784 return; 2842 return;
2785 } 2843 }
2786 if (static_cast<size_t>(bufsize) < result.size()) { 2844 if (static_cast<size_t>(bufsize) < result.size()) {
2787 SetGLError(GL_INVALID_OPERATION, 2845 SetGLError(GL_INVALID_OPERATION,
2788 "glProgramInfoCHROMIUM: bufsize is too small for result."); 2846 "glProgramInfoCHROMIUM: bufsize is too small for result.");
2789 return; 2847 return;
2790 } 2848 }
2791 memcpy(info, &result[0], result.size()); 2849 memcpy(info, &result[0], result.size());
2792 } 2850 }
2793 2851
2794 GLuint GLES2Implementation::CreateStreamTextureCHROMIUM(GLuint texture) { 2852 GLuint GLES2Implementation::CreateStreamTextureCHROMIUM(GLuint texture) {
2853 GPU_CLIENT_SINGLE_THREAD_CHECK();
2795 GPU_CLIENT_LOG("[" << this << "] CreateStreamTextureCHROMIUM(" 2854 GPU_CLIENT_LOG("[" << this << "] CreateStreamTextureCHROMIUM("
2796 << texture << ")"); 2855 << texture << ")");
2797 TRACE_EVENT0("gpu", "GLES2::CreateStreamTextureCHROMIUM"); 2856 TRACE_EVENT0("gpu", "GLES2::CreateStreamTextureCHROMIUM");
2798 typedef CreateStreamTextureCHROMIUM::Result Result; 2857 typedef CreateStreamTextureCHROMIUM::Result Result;
2799 Result* result = GetResultAs<Result*>(); 2858 Result* result = GetResultAs<Result*>();
2800 *result = GL_ZERO; 2859 *result = GL_ZERO;
2801 2860
2802 helper_->CreateStreamTextureCHROMIUM(texture, 2861 helper_->CreateStreamTextureCHROMIUM(texture,
2803 GetResultShmId(), 2862 GetResultShmId(),
2804 GetResultShmOffset()); 2863 GetResultShmOffset());
2805 WaitForCmd(); 2864 WaitForCmd();
2806 2865
2807 return *result; 2866 return *result;
2808 } 2867 }
2809 2868
2810 void GLES2Implementation::DestroyStreamTextureCHROMIUM(GLuint texture) { 2869 void GLES2Implementation::DestroyStreamTextureCHROMIUM(GLuint texture) {
2870 GPU_CLIENT_SINGLE_THREAD_CHECK();
2811 GPU_CLIENT_LOG("[" << this << "] DestroyStreamTextureCHROMIUM(" 2871 GPU_CLIENT_LOG("[" << this << "] DestroyStreamTextureCHROMIUM("
2812 << texture << ")"); 2872 << texture << ")");
2813 TRACE_EVENT0("gpu", "GLES2::DestroyStreamTextureCHROMIUM"); 2873 TRACE_EVENT0("gpu", "GLES2::DestroyStreamTextureCHROMIUM");
2814 helper_->DestroyStreamTextureCHROMIUM(texture); 2874 helper_->DestroyStreamTextureCHROMIUM(texture);
2815 } 2875 }
2816 2876
2817 void GLES2Implementation::PostSubBufferCHROMIUM( 2877 void GLES2Implementation::PostSubBufferCHROMIUM(
2818 GLint x, GLint y, GLint width, GLint height) { 2878 GLint x, GLint y, GLint width, GLint height) {
2879 GPU_CLIENT_SINGLE_THREAD_CHECK();
2819 GPU_CLIENT_LOG("[" << this << "] PostSubBufferCHROMIUM(" 2880 GPU_CLIENT_LOG("[" << this << "] PostSubBufferCHROMIUM("
2820 << x << ", " << y << ", " << width << ", " << height << ")"); 2881 << x << ", " << y << ", " << width << ", " << height << ")");
2821 TRACE_EVENT0("gpu", "GLES2::PostSubBufferCHROMIUM"); 2882 TRACE_EVENT0("gpu", "GLES2::PostSubBufferCHROMIUM");
2822 2883
2823 // Same flow control as GLES2Implementation::SwapBuffers (see comments there). 2884 // Same flow control as GLES2Implementation::SwapBuffers (see comments there).
2824 swap_buffers_tokens_.push(helper_->InsertToken()); 2885 swap_buffers_tokens_.push(helper_->InsertToken());
2825 helper_->PostSubBufferCHROMIUM(x, y, width, height); 2886 helper_->PostSubBufferCHROMIUM(x, y, width, height);
2826 helper_->CommandBufferHelper::Flush(); 2887 helper_->CommandBufferHelper::Flush();
2827 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) { 2888 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) {
2828 helper_->WaitForToken(swap_buffers_tokens_.front()); 2889 helper_->WaitForToken(swap_buffers_tokens_.front());
2829 swap_buffers_tokens_.pop(); 2890 swap_buffers_tokens_.pop();
2830 } 2891 }
2831 } 2892 }
2832 2893
2833 } // namespace gles2 2894 } // namespace gles2
2834 } // namespace gpu 2895 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698