diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/packer')
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/opcodes.py | 33 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_buffer.c | 25 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_extensions.c | 2 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_framebuffer.c | 2 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_misc.c | 84 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_pixels.c | 3 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_shaders.c | 24 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c | 6 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/packer.h | 4 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/packer.py | 4 | ||||
| -rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/packer_special | 4 |
11 files changed, 168 insertions, 23 deletions
diff --git a/src/VBox/GuestHost/OpenGL/packer/opcodes.py b/src/VBox/GuestHost/OpenGL/packer/opcodes.py index e198150b..f359d218 100644 --- a/src/VBox/GuestHost/OpenGL/packer/opcodes.py +++ b/src/VBox/GuestHost/OpenGL/packer/opcodes.py @@ -50,21 +50,50 @@ print "} CROpcode;\n" # count up number of extended opcode commands num_extends = 0 +num_auto_codes = 0 for func in keys: if "extpack" in apiutil.ChromiumProps(func): num_extends += 1 + if apiutil.ChromiumRelOpCode(func) < 0: + num_auto_codes += 1 + +# sanity check for compatibility breakage +# we currently have 304 +if num_auto_codes != 304: + print >> sys.stderr, "number of auto-generated op-codes should be 304, but is " + str(num_auto_codes) + print >> sys.stderr, "which breaks backwards compatibility" + print >> sys.stderr, "if this is really what you want to do, please adjust this script" + print >> sys.stderr, "to handle a new auto-generated opcodes count" + print "#error -- num_auto_codes should be 304, but is " + str(num_auto_codes) + sys.exit(-1) print "/* Functions with a return value or output parameters */" print "typedef enum {" +opcode_index = 0 enum_index = 0 +chrelopcodes = {} for func in keys: if "extpack" in apiutil.ChromiumProps(func): opcodeName = apiutil.ExtendedOpcodeName(func) + chrelopcode = apiutil.ChromiumRelOpCode(func) + opcode = -1 + if chrelopcode >= 0: + if not chrelopcode in chrelopcodes.keys(): + chrelopcodes[chrelopcode] = chrelopcode + else: + print >> sys.stderr, "non-unique chrelopcode: " + str(chrelopcode) + print "#error -- non-unique chrelopcode: " + str(num_auto_codes) + sys.exit(-1) + opcode = num_auto_codes + chrelopcode + else: + opcode = opcode_index + opcode_index = opcode_index + 1 + if enum_index != num_extends-1: - print "\t%s = %d," % (opcodeName, enum_index ) + print "\t%s = %d," % (opcodeName, opcode ) else: - print "\t%s = %d" % (opcodeName, enum_index ) + print "\t%s = %d" % (opcodeName, opcode ) enum_index = enum_index + 1 print "} CRExtendOpcode;\n" print "#endif /* CR_OPCODES_H */" diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c b/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c index 48d1250a..d4ddaf5f 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c @@ -149,7 +149,11 @@ void crPackResetPointers( CRPackContext *pc ) const GLboolean canBarf = pc->buffer.canBarf; CRPackBuffer *buf = pc->currentBuffer; CRASSERT(buf); - crPackInitBuffer( buf, buf->pack, buf->size, buf->mtu ); + crPackInitBuffer( buf, buf->pack, buf->size, buf->mtu +#ifdef IN_RING0 + , 0 +#endif + ); pc->buffer.geometry_only = geom_only; /* restore the flag */ pc->buffer.holds_BeginEnd = holds_BeginEnd; pc->buffer.in_BeginEnd = in_BeginEnd; @@ -221,9 +225,15 @@ crPackMaxData( int buffer_size ) * has 'mtu' bytes in it, we have to send it. The MTU might * be somewhat smaller than the buffer size. */ -void crPackInitBuffer( CRPackBuffer *buf, void *pack, int size, int mtu ) +void crPackInitBuffer( CRPackBuffer *buf, void *pack, int size, int mtu +#ifdef IN_RING0 + , unsigned int num_opcodes +#endif + ) { +#ifndef IN_RING0 unsigned int num_opcodes; +#endif CRASSERT(mtu <= size); @@ -231,7 +241,16 @@ void crPackInitBuffer( CRPackBuffer *buf, void *pack, int size, int mtu ) buf->mtu = mtu; buf->pack = pack; - num_opcodes = crPackMaxOpcodes( buf->size ); +#ifdef IN_RING0 + if(num_opcodes) + { + num_opcodes = (num_opcodes + 0x3) & (~0x3); + } + else +#endif + { + num_opcodes = crPackMaxOpcodes( buf->size ); + } buf->data_start = (unsigned char *) buf->pack + num_opcodes + sizeof(CRMessageOpcodes); diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_extensions.c b/src/VBox/GuestHost/OpenGL/packer/pack_extensions.c index 14b86a91..a8ae7fc4 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_extensions.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_extensions.c @@ -6,8 +6,6 @@ #include "packer.h" -#include <GL/glext.h> - int __packTexParameterNumParams( GLenum param ) { switch( param ) diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_framebuffer.c b/src/VBox/GuestHost/OpenGL/packer/pack_framebuffer.c index ab904d37..bc1ab543 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_framebuffer.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_framebuffer.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2009 Oracle Corporation + * Copyright (C) 2009-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_misc.c b/src/VBox/GuestHost/OpenGL/packer/pack_misc.c index 40da1223..ebc0e5bd 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_misc.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_misc.c @@ -7,7 +7,7 @@ #include "packer.h" #include "cr_error.h" -void PACK_APIENTRY crPackChromiumParametervCR(GLenum target, GLenum type, GLsizei count, const GLvoid *values) +void PACK_APIENTRY crPackChromiumParametervCR(CR_PACKER_CONTEXT_ARGDECL GLenum target, GLenum type, GLsizei count, const GLvoid *values) { CR_GET_PACKER_CONTEXT(pc); unsigned int header_length = 2 * sizeof(int) + sizeof(target) + sizeof(type) + sizeof(count); @@ -29,9 +29,11 @@ void PACK_APIENTRY crPackChromiumParametervCR(GLenum target, GLenum type, GLsize case GL_UNSIGNED_INT: params_length = sizeof(GLint) * count; break; +#ifndef IN_RING0 case GL_FLOAT: params_length = sizeof(GLfloat) * count; break; +#endif #if 0 case GL_DOUBLE: params_length = sizeof(GLdouble) * count; @@ -74,11 +76,13 @@ void PACK_APIENTRY crPackChromiumParametervCR(GLenum target, GLenum type, GLsize WRITE_DATA( pos, GLint, ((GLint *) values)[i]); } break; +#ifndef IN_RING0 case GL_FLOAT: for (i = 0; i < count; i++, pos += sizeof(GLfloat)) { WRITE_DATA( pos, GLfloat, ((GLfloat *) values)[i]); } break; +#endif #if 0 case GL_DOUBLE: for (i = 0; i < count; i++) { @@ -95,7 +99,8 @@ void PACK_APIENTRY crPackChromiumParametervCR(GLenum target, GLenum type, GLsize CR_UNLOCK_PACKER_CONTEXT(pc); } -void PACK_APIENTRY crPackDeleteQueriesARB(GLsizei n, const GLuint * ids) +#ifndef IN_RING0 +void PACK_APIENTRY crPackDeleteQueriesARB(CR_PACKER_CONTEXT_ARGDECL GLsizei n, const GLuint * ids) { unsigned char *data_ptr; int packet_length = sizeof(GLenum)+sizeof(n)+n*sizeof(*ids); @@ -107,3 +112,78 @@ void PACK_APIENTRY crPackDeleteQueriesARB(GLsizei n, const GLuint * ids) crHugePacket(CR_EXTEND_OPCODE, data_ptr); crPackFree(data_ptr); } +#endif + +void PACK_APIENTRY crPackVBoxTexPresent( CR_PACKER_CONTEXT_ARGDECL GLuint texture, GLuint cfg, GLint xPos, GLint yPos, GLint cRects, const GLint * pRects ) +{ + GLint i, size, cnt; + + CR_GET_PACKER_CONTEXT(pc); + unsigned char *data_ptr; + (void) pc; + size = 28 + cRects * 4 * sizeof(GLint); + CR_GET_BUFFERED_POINTER( pc, size ); + WRITE_DATA( 0, GLint, size ); + WRITE_DATA( 4, GLenum, CR_VBOXTEXPRESENT_EXTEND_OPCODE ); + WRITE_DATA( 8, GLuint, texture ); + WRITE_DATA( 12, GLuint, cfg ); + WRITE_DATA( 16, GLint, xPos ); + WRITE_DATA( 20, GLint, yPos ); + WRITE_DATA( 24, GLint, cRects ); + + cnt = 28; + for (i=0; i<cRects; ++i) + { + WRITE_DATA(cnt, GLint, (GLint) pRects[4*i+0]); + WRITE_DATA(cnt+4, GLint, (GLint) pRects[4*i+1]); + WRITE_DATA(cnt+8, GLint, (GLint) pRects[4*i+2]); + WRITE_DATA(cnt+12, GLint, (GLint) pRects[4*i+3]); + cnt += 16; + } + WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); + CR_UNLOCK_PACKER_CONTEXT(pc); +} + +void PACK_APIENTRY crPackWindowPosition( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint x, GLint y ) +{ + CR_GET_PACKER_CONTEXT(pc); + unsigned char *data_ptr; + (void) pc; + CR_GET_BUFFERED_POINTER( pc, 20 ); + WRITE_DATA( 0, GLint, 20 ); + WRITE_DATA( 4, GLenum, CR_WINDOWPOSITION_EXTEND_OPCODE ); + WRITE_DATA( 8, GLint, window ); + WRITE_DATA( 12, GLint, x ); + WRITE_DATA( 16, GLint, y ); + WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); + CR_UNLOCK_PACKER_CONTEXT(pc); +} + +void PACK_APIENTRY crPackWindowShow( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint flag ) +{ + CR_GET_PACKER_CONTEXT(pc); + unsigned char *data_ptr; + (void) pc; + CR_GET_BUFFERED_POINTER( pc, 16 ); + WRITE_DATA( 0, GLint, 16 ); + WRITE_DATA( 4, GLenum, CR_WINDOWSHOW_EXTEND_OPCODE ); + WRITE_DATA( 8, GLint, window ); + WRITE_DATA( 12, GLint, flag ); + WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); + CR_UNLOCK_PACKER_CONTEXT(pc); +} + +void PACK_APIENTRY crPackWindowSize( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint w, GLint h ) +{ + CR_GET_PACKER_CONTEXT(pc); + unsigned char *data_ptr; + (void) pc; + CR_GET_BUFFERED_POINTER( pc, 20 ); + WRITE_DATA( 0, GLint, 20 ); + WRITE_DATA( 4, GLenum, CR_WINDOWSIZE_EXTEND_OPCODE ); + WRITE_DATA( 8, GLint, window ); + WRITE_DATA( 12, GLint, w ); + WRITE_DATA( 16, GLint, h ); + WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); + CR_UNLOCK_PACKER_CONTEXT(pc); +} diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_pixels.c b/src/VBox/GuestHost/OpenGL/packer/pack_pixels.c index 19f2a1d5..2508643a 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_pixels.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_pixels.c @@ -143,7 +143,8 @@ void PACK_APIENTRY crPackBitmap(GLsizei width, GLsizei height, WRITE_DATA( 24, GLuint, noimagedata ); WRITE_DATA( 28, GLint, (GLint) (uintptr_t) bitmap); - crBitmapCopy(width, height, (GLubyte *)(data_ptr + 32), bitmap, unpack); + if (!noimagedata) + crBitmapCopy(width, height, (GLubyte *)(data_ptr + 32), bitmap, unpack); crHugePacket( CR_BITMAP_OPCODE, data_ptr ); crPackFree( data_ptr ); diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_shaders.c b/src/VBox/GuestHost/OpenGL/packer/pack_shaders.c index 36fc6bea..b788bd4d 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_shaders.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_shaders.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2009 Oracle Corporation + * Copyright (C) 2009-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -52,7 +52,7 @@ void PACK_APIENTRY crPackShaderSource(GLuint shader, GLsizei count, const char * for (i=0; i<count; ++i) { - pLocalLength[i] = (length && (length[i]>=0)) ? length[i] : crStrlen(string[i])+1; + pLocalLength[i] = ((length && (length[i]>=0)) ? length[i] : crStrlen(string[i]))+1; packet_length += pLocalLength[i]; } @@ -80,7 +80,17 @@ void PACK_APIENTRY crPackShaderSource(GLuint shader, GLsizei count, const char * { if (string[i]) { - crMemcpy(data_ptr, string[i], pLocalLength[i]); + if (length && (length[i]>=0)) + { + /* include \0 in the string to make intel drivers happy */ + crMemcpy(data_ptr, string[i], pLocalLength[i] - 1); + data_ptr[pLocalLength[i] - 1] = '\0'; + } + else + { + /* the \0 s already in the string */ + crMemcpy(data_ptr, string[i], pLocalLength[i]); + } } else { @@ -458,7 +468,7 @@ void PACK_APIENTRY crPackGetAttachedShaders(GLuint program, GLsizei maxCount, GL CR_UNLOCK_PACKER_CONTEXT(pc); } -void PACK_APIENTRY crPackGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj, int * writeback) +void PACK_APIENTRY crPackGetAttachedObjectsARB(VBoxGLhandleARB containerObj, GLsizei maxCount, GLsizei * count, VBoxGLhandleARB * obj, int * writeback) { CR_GET_PACKER_CONTEXT(pc); unsigned char *data_ptr; @@ -466,7 +476,7 @@ void PACK_APIENTRY crPackGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei CR_GET_BUFFERED_POINTER(pc, 32); WRITE_DATA(0, GLint, 32); WRITE_DATA(4, GLenum, CR_GETATTACHEDOBJECTSARB_EXTEND_OPCODE); - WRITE_DATA(8, GLhandleARB, containerObj); + WRITE_DATA(8, VBoxGLhandleARB, containerObj); WRITE_DATA(12, GLsizei, maxCount); WRITE_NETWORK_POINTER(16, (void *) count); WRITE_NETWORK_POINTER(24, (void *) writeback); @@ -474,7 +484,7 @@ void PACK_APIENTRY crPackGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei CR_UNLOCK_PACKER_CONTEXT(pc); } -void PACK_APIENTRY crPackGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog, int * writeback) +void PACK_APIENTRY crPackGetInfoLogARB(VBoxGLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog, int * writeback) { CR_GET_PACKER_CONTEXT(pc); unsigned char *data_ptr; @@ -482,7 +492,7 @@ void PACK_APIENTRY crPackGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsiz CR_GET_BUFFERED_POINTER(pc, 32); WRITE_DATA(0, GLint, 32); WRITE_DATA(4, GLenum, CR_GETINFOLOGARB_EXTEND_OPCODE); - WRITE_DATA(8, GLhandleARB, obj); + WRITE_DATA(8, VBoxGLhandleARB, obj); WRITE_DATA(12, GLsizei, maxLength); WRITE_NETWORK_POINTER(16, (void *) length); WRITE_NETWORK_POINTER(24, (void *) writeback); diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c b/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c index d76fc29c..e0155fc7 100644 --- a/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c +++ b/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2008 Oracle Corporation + * Copyright (C) 2008-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -22,7 +22,7 @@ #include <windows.h> #endif -void PACK_APIENTRY crPackWindowVisibleRegion( GLint window, GLint cRects, GLint * pRects ) +void PACK_APIENTRY crPackWindowVisibleRegion( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint cRects, const GLint * pRects ) { GLint i, size, cnt; @@ -49,7 +49,7 @@ void PACK_APIENTRY crPackWindowVisibleRegion( GLint window, GLint cRects, GLint CR_UNLOCK_PACKER_CONTEXT(pc); } -void PACK_APIENTRY crPackWindowVisibleRegionSWAP( GLint window, GLint cRects, GLint * pRects ) +void PACK_APIENTRY crPackWindowVisibleRegionSWAP( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint cRects, const GLint * pRects ) { crError( "crPackWindowVisibleRegionSWAP unimplemented and shouldn't be called" ); } diff --git a/src/VBox/GuestHost/OpenGL/packer/packer.h b/src/VBox/GuestHost/OpenGL/packer/packer.h index 965799a0..f70a5bb4 100644 --- a/src/VBox/GuestHost/OpenGL/packer/packer.h +++ b/src/VBox/GuestHost/OpenGL/packer/packer.h @@ -18,6 +18,10 @@ #include "packer_extensions.h" #include "cr_mem.h" +#ifndef IN_RING0 extern void __PackError( int line, const char *file, GLenum error, const char *info ); +#else +# define __PackError( line, file, error, info) do { AssertReleaseFailed(); } while (0) +#endif #endif /* CR_PACKER_H */ diff --git a/src/VBox/GuestHost/OpenGL/packer/packer.py b/src/VBox/GuestHost/OpenGL/packer/packer.py index a2708438..386b6bec 100644 --- a/src/VBox/GuestHost/OpenGL/packer/packer.py +++ b/src/VBox/GuestHost/OpenGL/packer/packer.py @@ -113,9 +113,9 @@ def UpdateCurrentPointer( func_name ): def PrintFunc( func_name, params, is_swapped, can_have_pointers ): """Emit a packer function.""" if is_swapped: - print 'void PACK_APIENTRY crPack%sSWAP( %s )' % (func_name, apiutil.MakeDeclarationString(params)) + print 'void PACK_APIENTRY crPack%sSWAP( %s )' % (func_name, apiutil.MakeDeclarationStringWithContext('CR_PACKER_CONTEXT', params)) else: - print 'void PACK_APIENTRY crPack%s( %s )' % (func_name, apiutil.MakeDeclarationString(params)) + print 'void PACK_APIENTRY crPack%s( %s )' % (func_name, apiutil.MakeDeclarationStringWithContext('CR_PACKER_CONTEXT', params)) print '{' print '\tCR_GET_PACKER_CONTEXT(pc);' diff --git a/src/VBox/GuestHost/OpenGL/packer/packer_special b/src/VBox/GuestHost/OpenGL/packer/packer_special index 848a05c5..b37cf2f3 100644 --- a/src/VBox/GuestHost/OpenGL/packer/packer_special +++ b/src/VBox/GuestHost/OpenGL/packer/packer_special @@ -176,3 +176,7 @@ UniformMatrix2x4fv UniformMatrix4x2fv UniformMatrix3x4fv UniformMatrix4x3fv +VBoxTexPresent +WindowPosition +WindowShow +WindowSize |
