Index: gpu/command_buffer/client/gles2_implementation.cc |
=================================================================== |
--- gpu/command_buffer/client/gles2_implementation.cc (revision 52147) |
+++ gpu/command_buffer/client/gles2_implementation.cc (working copy) |
@@ -5,6 +5,8 @@ |
// A class to emluate GLES2 over command buffers. |
#include "../client/gles2_implementation.h" |
+#include <GLES2/gles2_command_buffer.h> |
+#include "../client/mapped_memory.h" |
#include "../common/gles2_cmd_utils.h" |
#include "../common/id_allocator.h" |
@@ -420,6 +422,8 @@ |
result_buffer_ = transfer_buffer; |
result_shm_offset_ = 0; |
+ mapped_memory_.reset(new MappedMemoryManager(helper_)); |
+ |
if (share_resources) { |
buffer_id_handler_.reset( |
new SharedIdHandler(this, id_namespaces::kBuffers)); |
@@ -1462,5 +1466,103 @@ |
#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS) |
+void* GLES2Implementation::MapBufferSubData( |
+ GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { |
+ // NOTE: target is NOT checked because the service will check it |
+ // and we don't know what targets are valid. |
+ if (access != GL_WRITE_ONLY) { |
+ SetGLError(GL_INVALID_ENUM, "MapBufferSubData: bad access mode"); |
+ return NULL; |
+ } |
+ if (offset < 0 || size < 0) { |
+ SetGLError(GL_INVALID_VALUE, "MapBufferSubData: bad range"); |
+ return NULL; |
+ } |
+ int32 shm_id; |
+ unsigned int shm_offset; |
+ void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset); |
+ if (!mem) { |
+ SetGLError(GL_OUT_OF_MEMORY, "MapBufferSubData: out of memory"); |
+ return NULL; |
+ } |
+ |
+ std::pair<MappedBufferMap::iterator, bool> result = |
+ mapped_buffers_.insert(std::make_pair( |
+ mem, |
+ MappedBuffer( |
+ access, shm_id, mem, shm_offset, target, offset, size))); |
+ return mem; |
+} |
+ |
+void GLES2Implementation::UnmapBufferSubData(const void* mem) { |
+ MappedBufferMap::iterator it = mapped_buffers_.find(mem); |
+ if (it == mapped_buffers_.end()) { |
+ SetGLError(GL_INVALID_VALUE, "UnmapBufferSubData: buffer not mapped"); |
+ return; |
+ } |
+ const MappedBuffer& mb = it->second; |
+ helper_->BufferSubData( |
+ mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset); |
+ mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken()); |
+ mapped_buffers_.erase(it); |
+} |
+ |
+void* GLES2Implementation::MapTexSubImage2D( |
+ GLenum target, |
+ GLint level, |
+ GLint xoffset, |
+ GLint yoffset, |
+ GLsizei width, |
+ GLsizei height, |
+ GLenum format, |
+ GLenum type, |
+ GLenum access) { |
+ if (access != GL_WRITE_ONLY) { |
+ SetGLError(GL_INVALID_ENUM, "MapTexSubImage2D: bad access mode"); |
+ return NULL; |
+ } |
+ // NOTE: target is NOT checked because the service will check it |
+ // and we don't know what targets are valid. |
+ if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) { |
+ SetGLError(GL_INVALID_VALUE, "MapTexSubImage2D: bad dimensions"); |
+ return NULL; |
+ } |
+ uint32 size; |
+ if (!GLES2Util::ComputeImageDataSize( |
+ width, height, format, type, unpack_alignment_, &size)) { |
+ SetGLError(GL_INVALID_VALUE, "MapTexSubImage2D: image size too large"); |
+ return NULL; |
+ } |
+ int32 shm_id; |
+ unsigned int shm_offset; |
+ void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset); |
+ if (!mem) { |
+ SetGLError(GL_OUT_OF_MEMORY, "MapTexSubImage2D: out of memory"); |
+ return NULL; |
+ } |
+ |
+ std::pair<MappedTextureMap::iterator, bool> result = |
+ mapped_textures_.insert(std::make_pair( |
+ mem, |
+ MappedTexture( |
+ access, shm_id, mem, shm_offset, |
+ target, level, xoffset, yoffset, width, height, format, type))); |
+ return mem; |
+} |
+ |
+void GLES2Implementation::UnmapTexSubImage2D(const void* mem) { |
+ MappedTextureMap::iterator it = mapped_textures_.find(mem); |
+ if (it == mapped_textures_.end()) { |
+ SetGLError(GL_INVALID_VALUE, "UnmapTexSubImage2D: texture not mapped"); |
+ return; |
+ } |
+ const MappedTexture& mt = it->second; |
+ helper_->TexSubImage2D( |
+ mt.target, mt.level, mt.xoffset, mt.yoffset, mt.width, mt.height, |
+ mt.format, mt.type, mt.shm_id, mt.shm_offset); |
+ mapped_memory_->FreePendingToken(mt.shm_memory, helper_->InsertToken()); |
+ mapped_textures_.erase(it); |
+} |
+ |
} // namespace gles2 |
} // namespace gpu |