VirtualBox

Changeset 52260 in vbox


Ignore:
Timestamp:
Aug 4, 2014 11:59:46 AM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
95357
Message:

crOpenGL: proper support of GetErr being called from display list, better error handling

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/VBox

  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c

    r51559 r52260  
    206206        crUnlockMutex(&_PackMutex);
    207207    }
     208}
     209
     210void PACKSPU_APIENTRY packspu_NewList(GLuint list, GLenum mode)
     211{
     212    crStateNewList(list, mode);
     213    crPackNewList(list, mode);
     214}
     215
     216void PACKSPU_APIENTRY packspu_EndList()
     217{
     218    crStateEndList();
     219    crPackEndList();
    208220}
    209221
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special

    r51559 r52260  
    134134GenTextures
    135135CompileShader
     136NewList
     137EndList
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_pack.h

    r51315 r52260  
    252252  } while (0)
    253253
     254#define CR_CMDBLOCK_IS_STARTED( pc, op )  CRPACKBLOCKSTATE_IS_OP_STARTED((pc)->u32CmdBlockState, op)
    254255
    255256#define CR_CMDBLOCK_BEGIN( pc, op )                                 \
     
    257258    CR_LOCK_PACKER_CONTEXT(pc);                                     \
    258259    if (!cr_packer_cmd_blocks_enabled) break;                       \
    259     if (!CRPACKBLOCKSTATE_IS_STARTED(pc->u32CmdBlockState)) {       \
     260    if (!CRPACKBLOCKSTATE_IS_STARTED((pc)->u32CmdBlockState)) {       \
    260261      THREADASSERT( pc );                                           \
    261       CRASSERT( pc->currentBuffer );                                \
    262       if (!crPackBufferIsEmpty(&pc->buffer)) {                      \
    263         if ((*pc->buffer.opcode_start) != CR_NOP_OPCODE) {          \
    264           pc->Flush( pc->flush_arg );                               \
    265           Assert(crPackCanHoldOpcode( pc, 1, 4 ) );                 \
    266           CR_CMDBLOCK_OP( pc, CR_CMDBLOCKBEGIN_OPCODE );            \
     262      CRASSERT( (pc)->currentBuffer );                                \
     263      if (!crPackBufferIsEmpty(&(pc)->buffer)) {                      \
     264        if ((*(pc)->buffer.opcode_start) != CR_NOP_OPCODE) {          \
     265          (pc)->Flush( (pc)->flush_arg );                               \
     266          Assert(crPackCanHoldOpcode( (pc), 1, 4 ) );                 \
     267          CR_CMDBLOCK_OP( (pc), CR_CMDBLOCKBEGIN_OPCODE );            \
    267268        }                                                           \
    268269        else {                                                      \
    269           (*pc->buffer.opcode_start) = CR_CMDBLOCKBEGIN_OPCODE;     \
     270          (*(pc)->buffer.opcode_start) = CR_CMDBLOCKBEGIN_OPCODE;     \
    270271        }                                                           \
    271272      }                                                             \
    272273      else {                                                        \
    273         Assert(crPackCanHoldOpcode( pc, 1, 4 ) );                   \
    274         CR_CMDBLOCK_OP( pc, CR_CMDBLOCKBEGIN_OPCODE );              \
     274        Assert(crPackCanHoldOpcode( (pc), 1, 4 ) );                   \
     275        CR_CMDBLOCK_OP( (pc), CR_CMDBLOCKBEGIN_OPCODE );              \
    275276      }                                                             \
    276277    }                                                               \
    277     CRPACKBLOCKSTATE_OP_START(pc->u32CmdBlockState, op);            \
     278    Assert(!CRPACKBLOCKSTATE_IS_OP_STARTED((pc)->u32CmdBlockState, op)); \
     279    CRPACKBLOCKSTATE_OP_START((pc)->u32CmdBlockState, op);            \
     280    Assert(CRPACKBLOCKSTATE_IS_OP_STARTED((pc)->u32CmdBlockState, op)); \
    278281  } while (0)
    279282
     
    281284  do {                                                              \
    282285    if (!cr_packer_cmd_blocks_enabled) break;                       \
    283     CRPACKBLOCKSTATE_OP_STOP(pc->u32CmdBlockState, op);             \
    284     if (!CRPACKBLOCKSTATE_IS_STARTED(pc->u32CmdBlockState)) {       \
     286    Assert(CRPACKBLOCKSTATE_IS_OP_STARTED((pc)->u32CmdBlockState, op)); \
     287    CRPACKBLOCKSTATE_OP_STOP((pc)->u32CmdBlockState, op);             \
     288    Assert(!CRPACKBLOCKSTATE_IS_OP_STARTED((pc)->u32CmdBlockState, op)); \
     289    if (!CRPACKBLOCKSTATE_IS_STARTED((pc)->u32CmdBlockState)) {     \
    285290      THREADASSERT( pc );                                           \
    286       CRASSERT( pc->currentBuffer );                                \
    287       if (!crPackBufferIsEmpty(&pc->buffer)) {                      \
    288         if ((*pc->buffer.opcode_start) != CR_CMDBLOCKBEGIN_OPCODE) {\
     291      CRASSERT( (pc)->currentBuffer );                              \
     292      if (!crPackBufferIsEmpty(&(pc)->buffer)) {                    \
     293        if ((*(pc)->buffer.opcode_start) != CR_CMDBLOCKBEGIN_OPCODE) {\
    289294          if ( !crPackCanHoldOpcode( pc, 1, 4 ) ) {                 \
    290             pc->Flush( pc->flush_arg );                             \
     295            (pc)->Flush( (pc)->flush_arg );                         \
    291296            Assert(crPackCanHoldOpcode( pc, 1, 4 ) );               \
    292297          }                                                         \
    293298          CR_CMDBLOCK_OP( pc, CR_CMDBLOCKEND_OPCODE );              \
    294           pc->Flush( pc->flush_arg );                               \
     299          (pc)->Flush( (pc)->flush_arg );                           \
    295300        }                                                           \
    296301        else {                                                      \
    297           (*pc->buffer.opcode_start) = CR_NOP_OPCODE;               \
     302          (*(pc)->buffer.opcode_start) = CR_NOP_OPCODE;             \
    298303        }                                                           \
    299304      }                                                             \
     
    301306        Assert(crPackCanHoldOpcode( pc, 1, 4 ) );                   \
    302307        CR_CMDBLOCK_OP( pc, CR_CMDBLOCKEND_OPCODE );                \
    303         pc->Flush( pc->flush_arg );                                 \
     308        (pc)->Flush( pc->flush_arg );                               \
    304309      }                                                             \
    305310    }                                                               \
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h

    r51670 r52260  
    356356
    357357    GLboolean fCrCmdEnabled;
     358
     359    GLboolean fProcessingPendedCommands;
    358360
    359361    int numClients;
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_beginend.c

    r50973 r52260  
    1313    unsigned char *data_ptr;
    1414    (void) pc;
     15
     16    if (CR_CMDBLOCK_IS_STARTED(pc, CRPACKBLOCKSTATE_OP_BEGIN))
     17    {
     18        WARN(("recursive begin?"));
     19        return;
     20    }
    1521
    1622    CR_CMDBLOCK_BEGIN( pc, CRPACKBLOCKSTATE_OP_BEGIN );
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_lists.c

    r50973 r52260  
    6464    unsigned char *data_ptr;
    6565    (void) pc;
     66
     67    if (CR_CMDBLOCK_IS_STARTED(pc, CRPACKBLOCKSTATE_OP_NEWLIST))
     68    {
     69        WARN(("recursive NewList?"));
     70        return;
     71    }
     72
    6673    CR_CMDBLOCK_BEGIN( pc, CRPACKBLOCKSTATE_OP_NEWLIST );
    6774    CR_GET_BUFFERED_POINTER_NO_BEGINEND_FLUSH( pc, 16, GL_FALSE );
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_lists.c

    r45910 r52260  
    174174    CRStateBits *sb = GetCurrentBits();
    175175    CRbitvalue *bitID=g->bitid, *negbitID=g->neg_bitid;
     176
     177    CRASSERT(g_bVBoxEnableDiffOnMakeCurrent);
    176178
    177179    if (CHECKDIRTY(sb->buffer.dirty, negbitID))
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c

    r50829 r52260  
    7171static void crServerQueryHWState()
    7272{
    73     GLuint fbFbo, bbFbo;
    74     CRClient *client = cr_server.curClient;
    75     CRMuralInfo *mural = client ? client->currentMural : NULL;
    76     if (mural && mural->fRedirected)
    77     {
    78         fbFbo = mural->aidFBOs[CR_SERVER_FBO_FB_IDX(mural)];
    79         bbFbo = mural->aidFBOs[CR_SERVER_FBO_BB_IDX(mural)];
    80     }
    81     else
    82     {
    83         fbFbo = bbFbo = 0;
    84     }
    85     crStateQueryHWState(fbFbo, bbFbo);
     73    if (!cr_server.bUseMultipleContexts)
     74    {
     75        GLuint fbFbo, bbFbo;
     76        CRClient *client = cr_server.curClient;
     77        CRMuralInfo *mural = client ? client->currentMural : NULL;
     78        if (mural && mural->fRedirected)
     79        {
     80            fbFbo = mural->aidFBOs[CR_SERVER_FBO_FB_IDX(mural)];
     81            bbFbo = mural->aidFBOs[CR_SERVER_FBO_BB_IDX(mural)];
     82        }
     83        else
     84        {
     85            fbFbo = bbFbo = 0;
     86        }
     87        crStateQueryHWState(fbFbo, bbFbo);
     88    }
    8689}
    8790
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r51670 r52260  
    384384
    385385    cr_server.fCrCmdEnabled = GL_FALSE;
     386    cr_server.fProcessingPendedCommands = GL_FALSE;
    386387    CrHTableCreate(&cr_server.clientTable, CR_MAX_CLIENTS);
    387388
     
    491492
    492493    cr_server.fCrCmdEnabled = GL_FALSE;
     494    cr_server.fProcessingPendedCommands = GL_FALSE;
    493495    CrHTableCreate(&cr_server.clientTable, CR_MAX_CLIENTS);
    494496
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_retval.py

    r49245 r52260  
    2121void crServerReturnValue( const void *payload, unsigned int payload_len )
    2222{
    23     CRMessageReadback *rb;
    24     int msg_len = sizeof( *rb ) + payload_len;
    25 
    26     /* Don't reply to client if we're loading VM snapshot*/
    27     if (cr_server.bIsInLoadingState)
    28         return;
    29 
    30     if (cr_server.curClient->conn->type == CR_FILE)
    31     {
     23    if (!cr_server.fProcessingPendedCommands)
     24    {
     25        CRMessageReadback *rb;
     26        int msg_len = sizeof( *rb ) + payload_len;
     27   
     28        /* Don't reply to client if we're loading VM snapshot*/
     29        if (cr_server.bIsInLoadingState)
     30            return;
     31   
     32        if (cr_server.curClient->conn->type == CR_FILE)
     33        {
     34            return;
     35        }
     36   
     37        rb = (CRMessageReadback *) crAlloc( msg_len );
     38   
     39        rb->header.type = CR_MESSAGE_READBACK;
     40        CRDBGPTR_PRINTRB(cr_server.curClient->conn->u32ClientID, &cr_server.writeback_ptr);
     41        CRDBGPTR_CHECKNZ(&cr_server.writeback_ptr);
     42        CRDBGPTR_CHECKNZ(&cr_server.return_ptr);
     43        crMemcpy( &(rb->writeback_ptr), &(cr_server.writeback_ptr), sizeof( rb->writeback_ptr ) );
     44        crMemcpy( &(rb->readback_ptr), &(cr_server.return_ptr), sizeof( rb->readback_ptr ) );
     45        crMemcpy( rb+1, payload, payload_len );
     46        crNetSend( cr_server.curClient->conn, NULL, rb, msg_len );
     47        CRDBGPTR_SETZ(&cr_server.writeback_ptr);
     48        CRDBGPTR_SETZ(&cr_server.return_ptr);
     49        crFree( rb );
    3250        return;
    3351    }
    34 
    35     rb = (CRMessageReadback *) crAlloc( msg_len );
    36 
    37     rb->header.type = CR_MESSAGE_READBACK;
    38     CRDBGPTR_PRINTRB(cr_server.curClient->conn->u32ClientID, &cr_server.writeback_ptr);
    39     CRDBGPTR_CHECKNZ(&cr_server.writeback_ptr);
    40     CRDBGPTR_CHECKNZ(&cr_server.return_ptr);
    41     crMemcpy( &(rb->writeback_ptr), &(cr_server.writeback_ptr), sizeof( rb->writeback_ptr ) );
    42     crMemcpy( &(rb->readback_ptr), &(cr_server.return_ptr), sizeof( rb->readback_ptr ) );
    43     crMemcpy( rb+1, payload, payload_len );
    44     crNetSend( cr_server.curClient->conn, NULL, rb, msg_len );
     52#ifdef DEBUG_misha
     53    WARN(("Pending command returns value"));
     54#endif
    4555    CRDBGPTR_SETZ(&cr_server.writeback_ptr);
    4656    CRDBGPTR_SETZ(&cr_server.return_ptr);
    47     crFree( rb );
    4857}
    4958"""
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c

    r51356 r52260  
    551551{
    552552    CR_SERVER_PENDING_MSG *pIter, *pNext;
     553
     554    cr_server.fProcessingPendedCommands = GL_TRUE;
     555
    553556    RTListForEachSafe(&conn->PendingMsgList, pIter, pNext, CR_SERVER_PENDING_MSG, Node)
    554557    {
     
    574577        RTMemFree(pIter);
    575578    }
     579
     580    cr_server.fProcessingPendedCommands = GL_FALSE;
    576581}
    577582
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette