| Name |
| |
| CHROMIUM_map_sub |
| |
| Name Strings |
| |
| GL_CHROMIUM_map_sub |
| |
| Version |
| |
| Last Modifed Date: July 22, 2011 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. |
| |
| Overview |
| |
| This extension allows for more efficiently uploading of buffer or texture |
| data through Chromium's OpenGL ES 2.0 implementation. |
| |
| For security reasons Chromium accesses the GPU from a separate process. User |
| processes are not allowed to access the GPU directly. This multi-process |
| architechure has the advantage that GPU operations can be secured and |
| pipelined but it has the disadvantage that all data that is going to be |
| passed to GPU must first be made available to the separate GPU process. |
| |
| Chromium's OpenGL ES 2.0 implementation hides this issue when using the |
| standard OpenGL functions BufferData, BufferSubData, TexImage2D, and |
| TexSubImage2D by first copying the user's data to shared memory and then |
| telling the GPU process to use that shared memory to upload the data. |
| |
| This extension helps avoid that extra copy from user memory to shared memory |
| in a safe and secure manner. |
| |
| Issues |
| |
| This extension was designed for only 2 common use cases. |
| |
| #1) Dynamic textures. A good example would be a video player that needs to |
| upload video into a texture. |
| |
| #2) CPU based skinning. |
| |
| The common feature of these 2 use cases is the size of the texture in the |
| first case and the size of the buffer in the second case do not change |
| often. The implemenation of this extension is currently designed to never |
| free shared memory and re-use previously allocated shared memory that is no |
| longer in use. |
| |
| This design fits the 2 use cases above but it does not fit uploading lots of |
| arbitrarily sized pieces of data and so, at least in it's current |
| implemenation it should really be only used for cases similar to those |
| described above. |
| |
| New Tokens |
| |
| None |
| |
| New Procedures and Functions |
| |
| void* MapBufferSubDataCHROMIUM (GLuint target, GLintptr offset, |
| GLsizeiptr size, GLenum access) |
| |
| Returns a pointer to shared memory of the requested <size> or NULL if the |
| request can not be honoured. |
| |
| <target>, <offset> and <size> use the exact same parameters as |
| BufferSubData. <access> must be WRITE_ONLY. |
| |
| INVALID_ENUM is generated if <access> is not WRITE_ONLY |
| |
| INVALID_VALUE is generated if <offset> or <size> is negative |
| |
| void UnmapBufferSubDataCHROMIUM (const void* mem) |
| |
| Calling this function effectively calls BufferSubData with the parameters |
| that were specified when originally calling MapBufferSubData. Note that |
| after calling UnmapBufferSubDataCHROMIUM the application should assume that |
| the memory pointed do by <mem> is off limits and is no longer writable by |
| the application. Writing to it after calling UnmapBufferSubDataCHROMIUM will |
| produce undefined results. No security issues exist because of this but |
| which data makes it to the GPU will be unknown from the point of view of |
| the user program. |
| |
| <mem> is a pointer previously returned by calling MapBufferSubData and not |
| yet unmapped. |
| |
| INVALID_VALUE is generated if <mem> is not a value previously returned by |
| MapBufferSubData or if it has already been passed to |
| UnmapBufferSubDataCHROMIUM. |
| |
| Other errors are the same errors that would be returned by BufferSubData. |
| |
| void* MapTexSubImage2DCHROMIUM (GLenum target, GLint level, |
| GLint xoffset, GLint yoffset, |
| GLsizei width, GLsizei height, |
| GLenum format, GLenum type, GLenum access) |
| |
| Returns a pointer to shared memory that matches the image rectangle |
| described by <width>, <height>, <format>, <type> and the current PixelStorei |
| UNPACK_ALIGNMENT setting or NULL if the request can not be honoured. |
| |
| So for example, a width 3, height 4, format RGB, type UNSIGNED_BYTE, |
| UNPACK_ALIGNMENT 4 would return a pointer to a piece of memory 45 bytes |
| in size. Width 3 at RGB is 9 bytes. Padded to an UNPACK_ALIGNMENT of 4 means |
| 12 bytes per row. The last row is not padded. |
| |
| <target>, <level>, <xoffset>, <yoffset>, <width>, <height>, <format>, and |
| <type> use the exact same parameters as TexSubImage2D. <access> must be |
| WRITE_ONLY. |
| |
| INVALID_ENUM is generated if <access> is not WRITE_ONLY |
| |
| INVALID_VALUE is generated if <xoffset>, <yoffset>, <width>, <height> or |
| <level> is negative |
| |
| void UnmapTexSubImage2DCHROMIUM (const void* mem) |
| |
| Calling this function effectively calls TexSubImage2D with the parameters |
| that were specified when originally calling MapTexSubImage2D. Note that |
| after calling UnmapTexSubImage2DCHROMIUM the application should assume that |
| the memory pointed do by <mem> is off limits and is no longer writable by |
| the application. Writing to it after calling UnmapTexSubImage2DCHROMIUM will |
| produce undefined results. No security issues exist because of this but |
| which data makes it to the GPU will be unknown from the point of view of the |
| user program. |
| |
| <mem> is a pointer previously returned by calling MapTexSubImage2D and not |
| yet unmapped. |
| |
| INVALID_VALUE is generated if <mem> is not a value previously returned by |
| MapTexSubImage2D or if it has already been passed to |
| UnmapTexSubImage2DCHROMIUM. |
| |
| Other errors are the same errors that would be returned by TexSubImage2D. |
| |
| Errors |
| |
| None. |
| |
| New State |
| |
| None. |
| |
| Revision History |
| |
| 7/22/2011 Documented the extension |