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

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

Issue 14456004: GPU client side changes for GpuMemoryBuffers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@glapi
Patch Set: Created 7 years, 8 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 // 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 <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
11 #include <queue> 11 #include <queue>
12 #include <set> 12 #include <set>
13 #include <limits> 13 #include <limits>
14 #include <stdio.h> 14 #include <stdio.h>
15 #include <string.h> 15 #include <string.h>
16 #include <GLES2/gl2ext.h> 16 #include <GLES2/gl2ext.h>
17 #include <GLES2/gl2extchromium.h> 17 #include <GLES2/gl2extchromium.h>
18 #include "../client/buffer_tracker.h" 18 #include "../client/buffer_tracker.h"
19 #include "../client/gpu_memory_buffer.h"
20 #include "../client/gpu_memory_buffer_factory.h"
19 #include "../client/mapped_memory.h" 21 #include "../client/mapped_memory.h"
20 #include "../client/program_info_manager.h" 22 #include "../client/program_info_manager.h"
21 #include "../client/query_tracker.h" 23 #include "../client/query_tracker.h"
22 #include "../client/transfer_buffer.h" 24 #include "../client/transfer_buffer.h"
23 #include "../client/vertex_array_object_manager.h" 25 #include "../client/vertex_array_object_manager.h"
24 #include "../common/gles2_cmd_utils.h" 26 #include "../common/gles2_cmd_utils.h"
25 #include "../common/trace_event.h" 27 #include "../common/trace_event.h"
26 28
27 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 29 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
28 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS 30 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 unpack_skip_pixels_(0), 93 unpack_skip_pixels_(0),
92 pack_reverse_row_order_(false), 94 pack_reverse_row_order_(false),
93 active_texture_unit_(0), 95 active_texture_unit_(0),
94 bound_framebuffer_(0), 96 bound_framebuffer_(0),
95 bound_read_framebuffer_(0), 97 bound_read_framebuffer_(0),
96 bound_renderbuffer_(0), 98 bound_renderbuffer_(0),
97 current_program_(0), 99 current_program_(0),
98 bound_array_buffer_id_(0), 100 bound_array_buffer_id_(0),
99 bound_pixel_pack_transfer_buffer_id_(0), 101 bound_pixel_pack_transfer_buffer_id_(0),
100 bound_pixel_unpack_transfer_buffer_id_(0), 102 bound_pixel_unpack_transfer_buffer_id_(0),
103 bound_gpu_memory_buffer_id_(0),
101 error_bits_(0), 104 error_bits_(0),
102 debug_(false), 105 debug_(false),
103 use_count_(0), 106 use_count_(0),
104 current_query_(NULL), 107 current_query_(NULL),
105 error_message_callback_(NULL) { 108 error_message_callback_(NULL) {
106 GPU_DCHECK(helper); 109 GPU_DCHECK(helper);
107 GPU_DCHECK(transfer_buffer); 110 GPU_DCHECK(transfer_buffer);
108 111
109 char temp[128]; 112 char temp[128];
110 sprintf(temp, "%p", static_cast<void*>(this)); 113 sprintf(temp, "%p", static_cast<void*>(this));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 static_state_.int_state.num_compressed_texture_formats); 169 static_state_.int_state.num_compressed_texture_formats);
167 util_.set_num_shader_binary_formats( 170 util_.set_num_shader_binary_formats(
168 static_state_.int_state.num_shader_binary_formats); 171 static_state_.int_state.num_shader_binary_formats);
169 172
170 texture_units_.reset( 173 texture_units_.reset(
171 new TextureUnit[ 174 new TextureUnit[
172 static_state_.int_state.max_combined_texture_image_units]); 175 static_state_.int_state.max_combined_texture_image_units]);
173 176
174 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); 177 query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
175 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); 178 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
179 gpu_memory_buffer_tracker_.reset(new GpuMemoryBufferTracker());
176 180
177 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 181 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
178 GetIdHandler(id_namespaces::kBuffers)->MakeIds( 182 GetIdHandler(id_namespaces::kBuffers)->MakeIds(
179 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); 183 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]);
180 #endif 184 #endif
181 185
182 vertex_array_object_manager_.reset(new VertexArrayObjectManager( 186 vertex_array_object_manager_.reset(new VertexArrayObjectManager(
183 static_state_.int_state.max_vertex_attribs, 187 static_state_.int_state.max_vertex_attribs,
184 reserved_ids_[0], 188 reserved_ids_[0],
185 reserved_ids_[1])); 189 reserved_ids_[1]));
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 *params = bound_read_framebuffer_; 627 *params = bound_read_framebuffer_;
624 return true; 628 return true;
625 } 629 }
626 return false; 630 return false;
627 case GL_RENDERBUFFER_BINDING: 631 case GL_RENDERBUFFER_BINDING:
628 if (share_group_->bind_generates_resource()) { 632 if (share_group_->bind_generates_resource()) {
629 *params = bound_renderbuffer_; 633 *params = bound_renderbuffer_;
630 return true; 634 return true;
631 } 635 }
632 return false; 636 return false;
637 case GL_BOUND_GPU_MEMORY_BUFFER_CHROMIUM:
greggman 2013/04/25 23:45:34 Seems like following the other ENUMs this should b
kaanb1 2013/04/26 03:01:21 Done.
638 *params = bound_gpu_memory_buffer_id_;
639 return true;
633 default: 640 default:
634 return false; 641 return false;
635 } 642 }
636 } 643 }
637 644
638 bool GLES2Implementation::GetBooleanvHelper(GLenum pname, GLboolean* params) { 645 bool GLES2Implementation::GetBooleanvHelper(GLenum pname, GLboolean* params) {
639 // TODO(gman): Make this handle pnames that return more than 1 value. 646 // TODO(gman): Make this handle pnames that return more than 1 value.
640 GLint value; 647 GLint value;
641 if (!GetHelper(pname, &value)) { 648 if (!GetHelper(pname, &value)) {
642 return false; 649 return false;
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 } 1245 }
1239 } 1246 }
1240 1247
1241 GPU_DCHECK_EQ(total_size, offset); 1248 GPU_DCHECK_EQ(total_size, offset);
1242 1249
1243 helper_->ShaderSourceBucket(shader, kResultBucketId); 1250 helper_->ShaderSourceBucket(shader, kResultBucketId);
1244 helper_->SetBucketSize(kResultBucketId, 0); 1251 helper_->SetBucketSize(kResultBucketId, 0);
1245 CheckGLError(); 1252 CheckGLError();
1246 } 1253 }
1247 1254
1255 bool GLES2Implementation::GetBoundGpuMemoryBuffer(
greggman 2013/04/25 23:45:34 This function always returns true. Did you mean it
kaanb1 2013/04/26 03:01:21 GetBoundPixelTransferBuffer only returns false whe
1256 const char* function_name, GLuint* buffer_id) {
1257 *buffer_id = bound_gpu_memory_buffer_id_;
1258
1259 if (*buffer_id == 0) {
1260 SetGLError(GL_INVALID_OPERATION, function_name, "no buffer bound");
1261 }
1262
1263 return true;
1264 }
1265
1248 void GLES2Implementation::BufferDataHelper( 1266 void GLES2Implementation::BufferDataHelper(
1249 GLenum target, GLsizeiptr size, const void* data, GLenum usage) { 1267 GLenum target, GLsizeiptr size, const void* data, GLenum usage) {
1250 if (size < 0) { 1268 if (size < 0) {
1251 SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); 1269 SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0");
1252 return; 1270 return;
1253 } 1271 }
1254 1272
1255 GLuint buffer_id; 1273 GLuint buffer_id;
1256 if (GetBoundPixelTransferBuffer(target, "glBufferData", &buffer_id)) { 1274 if (GetBoundPixelTransferBuffer(target, "glBufferData", &buffer_id)) {
1257 if (!buffer_id) { 1275 if (!buffer_id) {
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
2010 precision[0] = result->precision; 2028 precision[0] = result->precision;
2011 GPU_CLIENT_LOG(" min_range: " << precision[0]); 2029 GPU_CLIENT_LOG(" min_range: " << precision[0]);
2012 } 2030 }
2013 } 2031 }
2014 CheckGLError(); 2032 CheckGLError();
2015 } 2033 }
2016 2034
2017 const GLubyte* GLES2Implementation::GetStringHelper(GLenum name) { 2035 const GLubyte* GLES2Implementation::GetStringHelper(GLenum name) {
2018 const char* result = NULL; 2036 const char* result = NULL;
2019 // Clears the bucket so if the command fails nothing will be in it. 2037 // Clears the bucket so if the command fails nothing will be in it.
2038 if (name == GL_BOUND_GPU_MEMORY_BUFFER_CHROMIUM_POINTER) {
greggman 2013/04/25 23:45:34 Doesn't this seem like a kind of abuse of this fun
kaanb1 2013/04/26 03:01:21 Done.
2039 return const_cast<const GLubyte*>(static_cast<GLubyte*>(
2040 GetNativeHandleForBoundGpuMemoryBuffer()));
jamesr 2013/04/25 23:24:15 this really seems like voodoo. are there no better
apatrick_chromium 2013/04/25 23:39:03 Agreed. I had a "wat?" moment.
kaanb1 2013/04/25 23:42:19 Would you be okay if I added a new public API that
no sievers 2013/04/26 00:17:43 You don't need a full-fledged GL API. This is only
kaanb1 2013/04/26 03:01:21 Looks like the test doesn't build when I just expo
2041 }
2042
2020 helper_->SetBucketSize(kResultBucketId, 0); 2043 helper_->SetBucketSize(kResultBucketId, 0);
2021 helper_->GetString(name, kResultBucketId); 2044 helper_->GetString(name, kResultBucketId);
2022 std::string str; 2045 std::string str;
2023 if (GetBucketAsString(kResultBucketId, &str)) { 2046 if (GetBucketAsString(kResultBucketId, &str)) {
2024 // Adds extensions implemented on client side only. 2047 // Adds extensions implemented on client side only.
2025 switch (name) { 2048 switch (name) {
2026 case GL_EXTENSIONS: 2049 case GL_EXTENSIONS:
2027 str += std::string(str.empty() ? "" : " ") + 2050 str += std::string(str.empty() ? "" : " ") +
2028 "GL_CHROMIUM_flipy " 2051 "GL_CHROMIUM_flipy "
2029 "GL_CHROMIUM_map_sub " 2052 "GL_CHROMIUM_map_sub "
greggman 2013/04/25 23:45:34 You should probably add a string here based on whi
kaanb1 2013/04/26 03:01:21 Done.
2030 "GL_CHROMIUM_shallow_flush " 2053 "GL_CHROMIUM_shallow_flush "
2031 "GL_EXT_unpack_subimage"; 2054 "GL_EXT_unpack_subimage";
2032 break; 2055 break;
2033 default: 2056 default:
2034 break; 2057 break;
2035 } 2058 }
2036 2059
2037 // Because of WebGL the extensions can change. We have to cache each unique 2060 // Because of WebGL the extensions can change. We have to cache each unique
2038 // result since we don't know when the client will stop referring to a 2061 // result since we don't know when the client will stop referring to a
2039 // previous one it queries. 2062 // previous one it queries.
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
2294 break; 2317 break;
2295 case GL_ELEMENT_ARRAY_BUFFER: 2318 case GL_ELEMENT_ARRAY_BUFFER:
2296 changed = vertex_array_object_manager_->BindElementArray(buffer); 2319 changed = vertex_array_object_manager_->BindElementArray(buffer);
2297 break; 2320 break;
2298 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: 2321 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
2299 bound_pixel_pack_transfer_buffer_id_ = buffer; 2322 bound_pixel_pack_transfer_buffer_id_ = buffer;
2300 break; 2323 break;
2301 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: 2324 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
2302 bound_pixel_unpack_transfer_buffer_id_ = buffer; 2325 bound_pixel_unpack_transfer_buffer_id_ = buffer;
2303 break; 2326 break;
2327 case GL_IMAGE_BUFFER_CHROMIUM:
2328 bound_gpu_memory_buffer_id_ = buffer;
2329 break;
2304 default: 2330 default:
2305 changed = true; 2331 changed = true;
2306 break; 2332 break;
2307 } 2333 }
2308 // TODO(gman): There's a bug here. If the target is invalid the ID will not be 2334 // TODO(gman): There's a bug here. If the target is invalid the ID will not be
2309 // used even though it's marked it as used here. 2335 // used even though it's marked it as used here.
2310 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer); 2336 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer);
2311 return changed; 2337 return changed;
2312 } 2338 }
2313 2339
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
2438 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffers[ii]); 2464 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffers[ii]);
2439 if (buffer) { 2465 if (buffer) {
2440 // Free buffer memory, pending the passage of a token. 2466 // Free buffer memory, pending the passage of a token.
2441 buffer_tracker_->FreePendingToken(buffer, helper_->InsertToken()); 2467 buffer_tracker_->FreePendingToken(buffer, helper_->InsertToken());
2442 // Remove buffer. 2468 // Remove buffer.
2443 buffer_tracker_->RemoveBuffer(buffers[ii]); 2469 buffer_tracker_->RemoveBuffer(buffers[ii]);
2444 } 2470 }
2445 if (buffers[ii] == bound_pixel_unpack_transfer_buffer_id_) { 2471 if (buffers[ii] == bound_pixel_unpack_transfer_buffer_id_) {
2446 bound_pixel_unpack_transfer_buffer_id_ = 0; 2472 bound_pixel_unpack_transfer_buffer_id_ = 0;
2447 } 2473 }
2474 if (buffers[ii] == bound_gpu_memory_buffer_id_) {
2475 bound_gpu_memory_buffer_id_ = 0;
2476 }
2477 GpuMemoryBuffer* gpu_buffer =
2478 gpu_memory_buffer_tracker_->GetBuffer(buffers[ii]);
2479 if (gpu_buffer) {
2480 gpu_memory_buffer_tracker_->RemoveBuffer(buffers[ii]);
2481 }
2448 } 2482 }
2449 } 2483 }
2450 2484
2451 void GLES2Implementation::DeleteBuffersStub( 2485 void GLES2Implementation::DeleteBuffersStub(
2452 GLsizei n, const GLuint* buffers) { 2486 GLsizei n, const GLuint* buffers) {
2453 helper_->DeleteBuffersImmediate(n, buffers); 2487 helper_->DeleteBuffersImmediate(n, buffers);
2454 } 2488 }
2455 2489
2456 2490
2457 void GLES2Implementation::DeleteFramebuffersHelper( 2491 void GLES2Implementation::DeleteFramebuffersHelper(
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after
3383 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode"); 3417 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode");
3384 return NULL; 3418 return NULL;
3385 } 3419 }
3386 break; 3420 break;
3387 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: 3421 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
3388 if (access != GL_WRITE_ONLY) { 3422 if (access != GL_WRITE_ONLY) {
3389 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode"); 3423 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode");
3390 return NULL; 3424 return NULL;
3391 } 3425 }
3392 break; 3426 break;
3427 case GL_IMAGE_BUFFER_CHROMIUM:
3428 break;
3393 default: 3429 default:
3394 SetGLError( 3430 SetGLError(
3395 GL_INVALID_ENUM, "glMapBufferCHROMIUM", "invalid target"); 3431 GL_INVALID_ENUM, "glMapBufferCHROMIUM", "invalid target");
3396 return NULL; 3432 return NULL;
3397 } 3433 }
3434
3398 GLuint buffer_id; 3435 GLuint buffer_id;
3436 if (target == GL_IMAGE_BUFFER_CHROMIUM &&
3437 GetBoundGpuMemoryBuffer("glMapBufferCHROMIUM", &buffer_id)) {
greggman 2013/04/25 23:45:34 If GetBoundGPUMemoryBuffer returns false (assuming
kaanb1 2013/04/26 03:01:21 Converted this function to use a switch statement.
3438 if (buffer_id == 0) {
3439 return NULL;
3440 }
3441
3442 GpuMemoryBuffer* gpu_buffer =
3443 gpu_memory_buffer_tracker_->GetBuffer(buffer_id);
3444 if (!gpu_buffer) {
3445 SetGLError(GL_INVALID_OPERATION,
3446 "glMapBufferCHROMIUM",
3447 "invalid GPU memory buffer");
3448 return NULL;
3449 }
3450 GpuMemoryBuffer::AccessMode mode = GpuMemoryBuffer::READ_ONLY;
3451 switch (access) {
3452 case GL_WRITE_ONLY:
3453 mode = GpuMemoryBuffer::WRITE_ONLY;
3454 break;
3455 case GL_READ_ONLY:
3456 mode = GpuMemoryBuffer::READ_ONLY;
3457 break;
3458 // TODO(kaanb): should we add GL_READ_WRITE to gl2ext.h?
3459 default:
3460 SetGLError(
3461 GL_INVALID_ENUM, "glMapBufferCHROMIUM", "invalid GPU access mode");
3462 return NULL;
3463 }
3464
3465 void* mapped_buffer = NULL;
3466 gpu_buffer->Map(mode, &mapped_buffer);
greggman 2013/04/25 23:45:34 The semantics of map buffer require that you can o
kaanb1 2013/04/26 03:01:21 Done.
3467 CheckGLError();
3468 return mapped_buffer;
3469 }
3470
3399 GetBoundPixelTransferBuffer(target, "glMapBufferCHROMIUM", &buffer_id); 3471 GetBoundPixelTransferBuffer(target, "glMapBufferCHROMIUM", &buffer_id);
3400 if (!buffer_id) { 3472 if (!buffer_id) {
3401 return NULL; 3473 return NULL;
3402 } 3474 }
3403 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id); 3475 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id);
3404 if (!buffer) { 3476 if (!buffer) {
3405 SetGLError(GL_INVALID_OPERATION, "glMapBufferCHROMIUM", "invalid buffer"); 3477 SetGLError(GL_INVALID_OPERATION, "glMapBufferCHROMIUM", "invalid buffer");
3406 return NULL; 3478 return NULL;
3407 } 3479 }
3408 if (buffer->mapped()) { 3480 if (buffer->mapped()) {
(...skipping 15 matching lines...) Expand all
3424 GPU_CLIENT_LOG(" returned " << buffer->address()); 3496 GPU_CLIENT_LOG(" returned " << buffer->address());
3425 CheckGLError(); 3497 CheckGLError();
3426 return buffer->address(); 3498 return buffer->address();
3427 } 3499 }
3428 3500
3429 GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) { 3501 GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) {
3430 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3502 GPU_CLIENT_SINGLE_THREAD_CHECK();
3431 GPU_CLIENT_LOG( 3503 GPU_CLIENT_LOG(
3432 "[" << GetLogPrefix() << "] glUnmapBufferCHROMIUM(" << target << ")"); 3504 "[" << GetLogPrefix() << "] glUnmapBufferCHROMIUM(" << target << ")");
3433 GLuint buffer_id; 3505 GLuint buffer_id;
3506 if (target == GL_IMAGE_BUFFER_CHROMIUM &&
3507 GetBoundGpuMemoryBuffer("glUnmapBufferCHROMIUM", &buffer_id)) {
greggman 2013/04/25 23:45:34 Same here. If GetBoundGpuMemroyBuffer returns fals
kaanb1 2013/04/26 03:01:21 Done.
3508 if (buffer_id == 0) {
3509 return false;
3510 }
3511
3512 GpuMemoryBuffer* gpu_buffer =
3513 gpu_memory_buffer_tracker_->GetBuffer(buffer_id);
3514
3515 gpu_buffer->Unmap();
greggman 2013/04/25 23:45:34 The semantics of map buffer require if the buffer
kaanb1 2013/04/26 03:01:21 Done.
3516 return true;
3517 }
3518
3434 if (!GetBoundPixelTransferBuffer(target, "glMapBufferCHROMIUM", &buffer_id)) { 3519 if (!GetBoundPixelTransferBuffer(target, "glMapBufferCHROMIUM", &buffer_id)) {
3435 SetGLError(GL_INVALID_ENUM, "glUnmapBufferCHROMIUM", "invalid target"); 3520 SetGLError(GL_INVALID_ENUM, "glUnmapBufferCHROMIUM", "invalid target");
3436 } 3521 }
3437 if (!buffer_id) { 3522 if (!buffer_id) {
3438 return false; 3523 return false;
3439 } 3524 }
3440 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id); 3525 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id);
3441 if (!buffer) { 3526 if (!buffer) {
3442 SetGLError(GL_INVALID_OPERATION, "glMapBufferCHROMIUM", "invalid buffer"); 3527 SetGLError(GL_INVALID_OPERATION, "glMapBufferCHROMIUM", "invalid buffer");
3443 return false; 3528 return false;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
3556 helper_->WaitAsyncTexImage2DCHROMIUM(target); 3641 helper_->WaitAsyncTexImage2DCHROMIUM(target);
3557 CheckGLError(); 3642 CheckGLError();
3558 } 3643 }
3559 3644
3560 GLuint GLES2Implementation::InsertSyncPointCHROMIUM() { 3645 GLuint GLES2Implementation::InsertSyncPointCHROMIUM() {
3561 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3646 GPU_CLIENT_SINGLE_THREAD_CHECK();
3562 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertSyncPointCHROMIUM"); 3647 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertSyncPointCHROMIUM");
3563 return helper_->InsertSyncPointCHROMIUM(); 3648 return helper_->InsertSyncPointCHROMIUM();
3564 } 3649 }
3565 3650
3651 void* GLES2Implementation::GetNativeHandleForBoundGpuMemoryBuffer() {
3652 if (bound_gpu_memory_buffer_id_ == 0) {
3653 return NULL;
3654 }
3655
3656 GpuMemoryBuffer* buffer =
3657 gpu_memory_buffer_tracker_->GetBuffer(bound_gpu_memory_buffer_id_);
3658
3659 return (buffer != NULL) ? buffer->GetNativeBuffer() : NULL;
3660 }
3661
3662 void GLES2Implementation::ImageBufferDataHelperCHROMIUM(
3663 GLenum target, GLsizei width, GLsizei height) {
3664 if (width < 0) {
3665 SetGLError(GL_INVALID_VALUE, "glImageBufferDataCHROMIUM", "width < 0");
3666 return;
3667 }
3668
3669 if (height < 0) {
3670 SetGLError(GL_INVALID_VALUE, "glImageBufferDataCHROMIUM", "height < 0");
3671 return;
3672 }
3673
3674 if (target != GL_IMAGE_BUFFER_CHROMIUM) {
3675 SetGLErrorInvalidEnum("glImageBufferDataCHROMIUM", target, "target");
3676 return;
3677 }
3678
3679 GLuint buffer_id;
3680 bool found_buffer = GetBoundGpuMemoryBuffer(
3681 "glImageBufferDataCHROMIUM", &buffer_id);
3682
3683 if (!found_buffer || buffer_id == 0) {
3684 return;
3685 }
3686
3687 GpuMemoryBuffer* buffer =
3688 gpu_memory_buffer_tracker_->GetBuffer(buffer_id);
3689 if (buffer) {
3690 // Remove old buffer, deletes the buffer pointer.
3691 gpu_memory_buffer_tracker_->RemoveBuffer(buffer_id);
3692 }
3693
3694 if (width != 0 && height != 0) {
3695 // Create new buffer.
3696 buffer = gpu_memory_buffer_tracker_->CreateBuffer(buffer_id, width, height);
3697 GPU_DCHECK(buffer);
3698 }
3699
3700 return;
3701 }
3702
3703 void GLES2Implementation::ImageBufferDataCHROMIUM(
3704 GLenum target, GLsizei width, GLsizei height) {
3705 GPU_CLIENT_SINGLE_THREAD_CHECK();
3706 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glImageBufferDataCHROMIUM("
3707 << GLES2Util::GetStringBufferTarget(target) << ", "
3708 << width << ", "
3709 << height << ")");
3710 ImageBufferDataHelperCHROMIUM(target, width, height);
3711 CheckGLError();
3712 }
3713
3714
3566 // Include the auto-generated part of this file. We split this because it means 3715 // Include the auto-generated part of this file. We split this because it means
3567 // we can easily edit the non-auto generated parts right here in this file 3716 // we can easily edit the non-auto generated parts right here in this file
3568 // instead of having to edit some template or the code generator. 3717 // instead of having to edit some template or the code generator.
3569 #include "../client/gles2_implementation_impl_autogen.h" 3718 #include "../client/gles2_implementation_impl_autogen.h"
3570 3719
3571 } // namespace gles2 3720 } // namespace gles2
3572 } // namespace gpu 3721 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698