VCHPRE_ int VCHPOST_ vc_dispmanx_resource_write_data_handle( DISPMANX_RESOURCE_HANDLE_T handle, VC_IMAGE_TYPE_T src_type /* not used */, int src_pitch, VCHI_MEM_HANDLE_T mem_handle, uint32_t offset, const VC_RECT_T * rect ) { int32_t bulk_len; uint32_t param[3]; uint32_t success = 0; //Note that x coordinate of the rect is NOT used //Address of data in host offset += src_pitch * rect->y; bulk_len = src_pitch * rect->height; //Now send the bulk transfer across //command parameters: resource handle, destination y, bulk length param[0] = VC_HTOV32(handle); param[1] = VC_HTOV32(rect->y); param[2] = VC_HTOV32(bulk_len); success = dispmanx_send_command( EDispmanBulkWrite | DISPMANX_NO_REPLY_MASK, param, sizeof(param)); if(success == 0) { lock_obtain(); success = vchi_bulk_queue_transmit_reloc( dispmanx_client.client_handle[0], mem_handle, offset, bulk_len, VCHI_FLAGS_BLOCK_UNTIL_DATA_READ, NULL ); lock_release(); } return (int) success; }
// if handle==MEM_HANDLE_INVALID: data is a pointer, size is length // if handle!=MEM_HANDLE_INVALID: data is int, offset from handle base, size is length void vchiq_queue_bulk_transmit(VCHIQ_STATE_T *state, int fourcc, VCHI_MEM_HANDLE_T handle, const void *data, int size, void *userdata) { VCHIQ_WRAPPER_T *st = wrapper_list; while(st != NULL && (st->state != state || st->fourcc != fourcc)) st = st->next; vcos_demand(st != NULL); if(handle == MEM_HANDLE_INVALID) vchi_bulk_queue_transmit(st->vchi_handle, data, size, VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); else vchi_bulk_queue_transmit_reloc(st->vchi_handle, handle, (uint32_t) data, size, VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); }