int crPackCanHoldBoundedBuffer( const CRPackBuffer *src ) { const int len_aligned = (src->data_current - src->opcode_current - 1 + 3) & ~3; CR_GET_PACKER_CONTEXT(pc); /* 24 is the size of the bounds-info packet... */ return crPackCanHoldOpcode( pc, 1, len_aligned + 24 ); }
int crPackCanHoldBuffer( const CRPackBuffer *src ) { const int num_data = crPackNumData(src); const int num_opcode = crPackNumOpcodes(src); GET_PACKER_CONTEXT(pc); return crPackCanHoldOpcode( pc, num_opcode, num_data ); }
int crPackCanHoldBuffer( const CRPackBuffer *src ) { const int num_data = crPackNumData(src); const int num_opcode = crPackNumOpcodes(src); int res; CR_GET_PACKER_CONTEXT(pc); CR_LOCK_PACKER_CONTEXT(pc); res = crPackCanHoldOpcode( pc, num_opcode, num_data ); CR_UNLOCK_PACKER_CONTEXT(pc); return res; }
/* * Allocate space for a command that might be very large, such as * glTexImage2D or glBufferDataARB call. * The command buffer _MUST_ then be transmitted by calling crHugePacket. */ void *crPackAlloc( unsigned int size ) { CR_GET_PACKER_CONTEXT(pc); unsigned char *data_ptr; /* include space for the length and make the payload word-aligned */ size = ( size + sizeof(unsigned int) + 0x3 ) & ~0x3; CR_LOCK_PACKER_CONTEXT(pc); if ( crPackCanHoldOpcode( pc, 1, size ) ) { /* we can just put it in the current buffer */ CR_GET_BUFFERED_POINTER_NOLOCK(pc, size ); /* NOTE: this sets data_ptr */ } else { /* Okay, it didn't fit. Maybe it will after we flush. */ CR_UNLOCK_PACKER_CONTEXT(pc); pc->Flush( pc->flush_arg ); CR_LOCK_PACKER_CONTEXT(pc); if ( crPackCanHoldOpcode( pc, 1, size ) ) { CR_GET_BUFFERED_POINTER_NOLOCK(pc, size ); /* NOTE: this sets data_ptr */ } else { /* It's really way too big, so allocate a temporary packet * with space for the single opcode plus the payload & * header. */ data_ptr = (unsigned char *) crAlloc( sizeof(CRMessageOpcodes) + 4 + size ); /* skip the header & opcode space */ data_ptr += sizeof(CRMessageOpcodes) + 4; } } /* At the top of the function, we added four to the request size and * rounded it up to the next multiple of four. * * At this point, we have: * * HIGH MEM | byte size - 1 | \ * ... | * ... | - original 'size' bytes for data * | operand data | | * return value -> | operand data | / * | byte 3 | \ * | byte 2 | |- These bytes will store 'size' * | byte 1 | | * data_ptr -> | byte 0 | / * | CR opcode | <- Set in packspuHuge() * | unused | * | unused | * | unused | * | CRMessageOpcodes | * | CRMessageOpcodes | * ... * | CRMessageOpcodes | * | CRMessageOpcodes | * LOW MEM +------------------+ */ if (pc->swapping) { *((unsigned int *) data_ptr) = SWAP32(size); crDebug( "Just swapped the length, putting %d on the wire!", *((unsigned int *) data_ptr)); } else { *((unsigned int *) data_ptr) = size; } #ifndef CHROMIUM_THREADSAFE sanityCheckPointer = data_ptr + 4; #endif return data_ptr + 4; }