Path: blob/21.2-virgl/src/gallium/auxiliary/rbug/rbug_context.c
4561 views
/*1* Copyright 2009 VMware, Inc.2* All Rights Reserved.3*4* Permission is hereby granted, free of charge, to any person obtaining a5* copy of this software and associated documentation files (the "Software"),6* to deal in the Software without restriction, including without limitation7* on the rights to use, copy, modify, merge, publish, distribute, sub8* license, and/or sell copies of the Software, and to permit persons to whom9* the Software is furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice (including the next12* paragraph) shall be included in all copies or substantial portions of the13* Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL18* VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,19* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR20* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE21* USE OR OTHER DEALINGS IN THE SOFTWARE.22*/2324/*25* This file holds the function implementation for one of the rbug extensions.26* Prototypes and declerations of functions and structs is in the same folder27* in the header file matching this file's name.28*29* The functions starting rbug_send_* encodes a call to the write format and30* sends that to the supplied connection, while functions starting with31* rbug_demarshal_* demarshal data in the wire protocol.32*33* Functions ending with _reply are replies to requests.34*/3536#include "rbug_internal.h"37#include "rbug_context.h"3839int rbug_send_context_list(struct rbug_connection *__con,40uint32_t *__serial)41{42uint32_t __len = 0;43uint32_t __pos = 0;44uint8_t *__data = NULL;45int __ret = 0;4647LEN(8); /* header */4849/* align */50PAD(__len, 8);5152__data = (uint8_t*)MALLOC(__len);53if (!__data)54return -ENOMEM;5556WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST));57WRITE(4, uint32_t, ((uint32_t)(__len / 4)));5859/* final pad */60PAD(__pos, 8);6162if (__pos != __len) {63__ret = -EINVAL;64} else {65rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST, __len);66rbug_connection_write(__con, __data, __len);67__ret = rbug_connection_send_finish(__con, __serial);68}6970FREE(__data);71return __ret;72}7374int rbug_send_context_info(struct rbug_connection *__con,75rbug_context_t context,76uint32_t *__serial)77{78uint32_t __len = 0;79uint32_t __pos = 0;80uint8_t *__data = NULL;81int __ret = 0;8283LEN(8); /* header */84LEN(8); /* context */8586/* align */87PAD(__len, 8);8889__data = (uint8_t*)MALLOC(__len);90if (!__data)91return -ENOMEM;9293WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO));94WRITE(4, uint32_t, ((uint32_t)(__len / 4)));95WRITE(8, rbug_context_t, context); /* context */9697/* final pad */98PAD(__pos, 8);99100if (__pos != __len) {101__ret = -EINVAL;102} else {103rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO, __len);104rbug_connection_write(__con, __data, __len);105__ret = rbug_connection_send_finish(__con, __serial);106}107108FREE(__data);109return __ret;110}111112int rbug_send_context_draw_block(struct rbug_connection *__con,113rbug_context_t context,114rbug_block_t block,115uint32_t *__serial)116{117uint32_t __len = 0;118uint32_t __pos = 0;119uint8_t *__data = NULL;120int __ret = 0;121122LEN(8); /* header */123LEN(8); /* context */124LEN(4); /* block */125126/* align */127PAD(__len, 8);128129__data = (uint8_t*)MALLOC(__len);130if (!__data)131return -ENOMEM;132133WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCK));134WRITE(4, uint32_t, ((uint32_t)(__len / 4)));135WRITE(8, rbug_context_t, context); /* context */136WRITE(4, rbug_block_t, block); /* block */137138/* final pad */139PAD(__pos, 8);140141if (__pos != __len) {142__ret = -EINVAL;143} else {144rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_BLOCK, __len);145rbug_connection_write(__con, __data, __len);146__ret = rbug_connection_send_finish(__con, __serial);147}148149FREE(__data);150return __ret;151}152153int rbug_send_context_draw_step(struct rbug_connection *__con,154rbug_context_t context,155rbug_block_t step,156uint32_t *__serial)157{158uint32_t __len = 0;159uint32_t __pos = 0;160uint8_t *__data = NULL;161int __ret = 0;162163LEN(8); /* header */164LEN(8); /* context */165LEN(4); /* step */166167/* align */168PAD(__len, 8);169170__data = (uint8_t*)MALLOC(__len);171if (!__data)172return -ENOMEM;173174WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_STEP));175WRITE(4, uint32_t, ((uint32_t)(__len / 4)));176WRITE(8, rbug_context_t, context); /* context */177WRITE(4, rbug_block_t, step); /* step */178179/* final pad */180PAD(__pos, 8);181182if (__pos != __len) {183__ret = -EINVAL;184} else {185rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_STEP, __len);186rbug_connection_write(__con, __data, __len);187__ret = rbug_connection_send_finish(__con, __serial);188}189190FREE(__data);191return __ret;192}193194int rbug_send_context_draw_unblock(struct rbug_connection *__con,195rbug_context_t context,196rbug_block_t unblock,197uint32_t *__serial)198{199uint32_t __len = 0;200uint32_t __pos = 0;201uint8_t *__data = NULL;202int __ret = 0;203204LEN(8); /* header */205LEN(8); /* context */206LEN(4); /* unblock */207208/* align */209PAD(__len, 8);210211__data = (uint8_t*)MALLOC(__len);212if (!__data)213return -ENOMEM;214215WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK));216WRITE(4, uint32_t, ((uint32_t)(__len / 4)));217WRITE(8, rbug_context_t, context); /* context */218WRITE(4, rbug_block_t, unblock); /* unblock */219220/* final pad */221PAD(__pos, 8);222223if (__pos != __len) {224__ret = -EINVAL;225} else {226rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_UNBLOCK, __len);227rbug_connection_write(__con, __data, __len);228__ret = rbug_connection_send_finish(__con, __serial);229}230231FREE(__data);232return __ret;233}234235int rbug_send_context_draw_rule(struct rbug_connection *__con,236rbug_context_t context,237rbug_shader_t vertex,238rbug_shader_t fragment,239rbug_texture_t texture,240rbug_texture_t surface,241rbug_block_t block,242uint32_t *__serial)243{244uint32_t __len = 0;245uint32_t __pos = 0;246uint8_t *__data = NULL;247int __ret = 0;248249LEN(8); /* header */250LEN(8); /* context */251LEN(8); /* vertex */252LEN(8); /* fragment */253LEN(8); /* texture */254LEN(8); /* surface */255LEN(4); /* block */256257/* align */258PAD(__len, 8);259260__data = (uint8_t*)MALLOC(__len);261if (!__data)262return -ENOMEM;263264WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_RULE));265WRITE(4, uint32_t, ((uint32_t)(__len / 4)));266WRITE(8, rbug_context_t, context); /* context */267WRITE(8, rbug_shader_t, vertex); /* vertex */268WRITE(8, rbug_shader_t, fragment); /* fragment */269WRITE(8, rbug_texture_t, texture); /* texture */270WRITE(8, rbug_texture_t, surface); /* surface */271WRITE(4, rbug_block_t, block); /* block */272273/* final pad */274PAD(__pos, 8);275276if (__pos != __len) {277__ret = -EINVAL;278} else {279rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_RULE, __len);280rbug_connection_write(__con, __data, __len);281__ret = rbug_connection_send_finish(__con, __serial);282}283284FREE(__data);285return __ret;286}287288int rbug_send_context_flush(struct rbug_connection *__con,289rbug_context_t context,290uint32_t *__serial)291{292uint32_t __len = 0;293uint32_t __pos = 0;294uint8_t *__data = NULL;295int __ret = 0;296297LEN(8); /* header */298LEN(8); /* context */299300/* align */301PAD(__len, 8);302303__data = (uint8_t*)MALLOC(__len);304if (!__data)305return -ENOMEM;306307WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_FLUSH));308WRITE(4, uint32_t, ((uint32_t)(__len / 4)));309WRITE(8, rbug_context_t, context); /* context */310311/* final pad */312PAD(__pos, 8);313314if (__pos != __len) {315__ret = -EINVAL;316} else {317rbug_connection_send_start(__con, RBUG_OP_CONTEXT_FLUSH, __len);318rbug_connection_write(__con, __data, __len);319__ret = rbug_connection_send_finish(__con, __serial);320}321322FREE(__data);323return __ret;324}325326int rbug_send_context_list_reply(struct rbug_connection *__con,327uint32_t serial,328rbug_context_t *contexts,329uint32_t contexts_len,330uint32_t *__serial)331{332uint32_t __len = 0;333uint32_t __pos = 0;334uint8_t *__data = NULL;335int __ret = 0;336337LEN(8); /* header */338LEN(4); /* serial */339LEN_ARRAY(8, contexts); /* contexts */340341/* align */342PAD(__len, 8);343344__data = (uint8_t*)MALLOC(__len);345if (!__data)346return -ENOMEM;347348WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_LIST_REPLY));349WRITE(4, uint32_t, ((uint32_t)(__len / 4)));350WRITE(4, uint32_t, serial); /* serial */351WRITE_ARRAY(8, rbug_context_t, contexts); /* contexts */352353/* final pad */354PAD(__pos, 8);355356if (__pos != __len) {357__ret = -EINVAL;358} else {359rbug_connection_send_start(__con, RBUG_OP_CONTEXT_LIST_REPLY, __len);360rbug_connection_write(__con, __data, __len);361__ret = rbug_connection_send_finish(__con, __serial);362}363364FREE(__data);365return __ret;366}367368int rbug_send_context_info_reply(struct rbug_connection *__con,369uint32_t serial,370rbug_shader_t vertex,371rbug_shader_t fragment,372rbug_texture_t *texs,373uint32_t texs_len,374rbug_texture_t *cbufs,375uint32_t cbufs_len,376rbug_texture_t zsbuf,377rbug_block_t blocker,378rbug_block_t blocked,379uint32_t *__serial)380{381uint32_t __len = 0;382uint32_t __pos = 0;383uint8_t *__data = NULL;384int __ret = 0;385386LEN(8); /* header */387LEN(4); /* serial */388LEN(8); /* vertex */389LEN(8); /* fragment */390LEN_ARRAY(8, texs); /* texs */391LEN_ARRAY(8, cbufs); /* cbufs */392LEN(8); /* zsbuf */393LEN(4); /* blocker */394LEN(4); /* blocked */395396/* align */397PAD(__len, 8);398399__data = (uint8_t*)MALLOC(__len);400if (!__data)401return -ENOMEM;402403WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_INFO_REPLY));404WRITE(4, uint32_t, ((uint32_t)(__len / 4)));405WRITE(4, uint32_t, serial); /* serial */406WRITE(8, rbug_shader_t, vertex); /* vertex */407WRITE(8, rbug_shader_t, fragment); /* fragment */408WRITE_ARRAY(8, rbug_texture_t, texs); /* texs */409WRITE_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */410WRITE(8, rbug_texture_t, zsbuf); /* zsbuf */411WRITE(4, rbug_block_t, blocker); /* blocker */412WRITE(4, rbug_block_t, blocked); /* blocked */413414/* final pad */415PAD(__pos, 8);416417if (__pos != __len) {418__ret = -EINVAL;419} else {420rbug_connection_send_start(__con, RBUG_OP_CONTEXT_INFO_REPLY, __len);421rbug_connection_write(__con, __data, __len);422__ret = rbug_connection_send_finish(__con, __serial);423}424425FREE(__data);426return __ret;427}428429int rbug_send_context_draw_blocked(struct rbug_connection *__con,430rbug_context_t context,431rbug_block_t block,432uint32_t *__serial)433{434uint32_t __len = 0;435uint32_t __pos = 0;436uint8_t *__data = NULL;437int __ret = 0;438439LEN(8); /* header */440LEN(8); /* context */441LEN(4); /* block */442443/* align */444PAD(__len, 8);445446__data = (uint8_t*)MALLOC(__len);447if (!__data)448return -ENOMEM;449450WRITE(4, int32_t, ((int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED));451WRITE(4, uint32_t, ((uint32_t)(__len / 4)));452WRITE(8, rbug_context_t, context); /* context */453WRITE(4, rbug_block_t, block); /* block */454455/* final pad */456PAD(__pos, 8);457458if (__pos != __len) {459__ret = -EINVAL;460} else {461rbug_connection_send_start(__con, RBUG_OP_CONTEXT_DRAW_BLOCKED, __len);462rbug_connection_write(__con, __data, __len);463__ret = rbug_connection_send_finish(__con, __serial);464}465466FREE(__data);467return __ret;468}469470struct rbug_proto_context_list * rbug_demarshal_context_list(struct rbug_proto_header *header)471{472struct rbug_proto_context_list *ret;473474if (!header)475return NULL;476if (header->opcode != (int32_t)RBUG_OP_CONTEXT_LIST)477return NULL;478479ret = MALLOC(sizeof(*ret));480if (!ret)481return NULL;482483ret->header.__message = header;484ret->header.opcode = header->opcode;485486return ret;487}488489struct rbug_proto_context_info * rbug_demarshal_context_info(struct rbug_proto_header *header)490{491uint32_t len = 0;492uint32_t pos = 0;493uint8_t *data = NULL;494struct rbug_proto_context_info *ret;495496if (!header)497return NULL;498if (header->opcode != (int32_t)RBUG_OP_CONTEXT_INFO)499return NULL;500501pos = 0;502len = header->length * 4;503data = (uint8_t*)&header[1];504ret = MALLOC(sizeof(*ret));505if (!ret)506return NULL;507508ret->header.__message = header;509ret->header.opcode = header->opcode;510511READ(8, rbug_context_t, context); /* context */512513return ret;514}515516struct rbug_proto_context_draw_block * rbug_demarshal_context_draw_block(struct rbug_proto_header *header)517{518uint32_t len = 0;519uint32_t pos = 0;520uint8_t *data = NULL;521struct rbug_proto_context_draw_block *ret;522523if (!header)524return NULL;525if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_BLOCK)526return NULL;527528pos = 0;529len = header->length * 4;530data = (uint8_t*)&header[1];531ret = MALLOC(sizeof(*ret));532if (!ret)533return NULL;534535ret->header.__message = header;536ret->header.opcode = header->opcode;537538READ(8, rbug_context_t, context); /* context */539READ(4, rbug_block_t, block); /* block */540541return ret;542}543544struct rbug_proto_context_draw_step * rbug_demarshal_context_draw_step(struct rbug_proto_header *header)545{546uint32_t len = 0;547uint32_t pos = 0;548uint8_t *data = NULL;549struct rbug_proto_context_draw_step *ret;550551if (!header)552return NULL;553if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_STEP)554return NULL;555556pos = 0;557len = header->length * 4;558data = (uint8_t*)&header[1];559ret = MALLOC(sizeof(*ret));560if (!ret)561return NULL;562563ret->header.__message = header;564ret->header.opcode = header->opcode;565566READ(8, rbug_context_t, context); /* context */567READ(4, rbug_block_t, step); /* step */568569return ret;570}571572struct rbug_proto_context_draw_unblock * rbug_demarshal_context_draw_unblock(struct rbug_proto_header *header)573{574uint32_t len = 0;575uint32_t pos = 0;576uint8_t *data = NULL;577struct rbug_proto_context_draw_unblock *ret;578579if (!header)580return NULL;581if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_UNBLOCK)582return NULL;583584pos = 0;585len = header->length * 4;586data = (uint8_t*)&header[1];587ret = MALLOC(sizeof(*ret));588if (!ret)589return NULL;590591ret->header.__message = header;592ret->header.opcode = header->opcode;593594READ(8, rbug_context_t, context); /* context */595READ(4, rbug_block_t, unblock); /* unblock */596597return ret;598}599600struct rbug_proto_context_draw_rule * rbug_demarshal_context_draw_rule(struct rbug_proto_header *header)601{602uint32_t len = 0;603uint32_t pos = 0;604uint8_t *data = NULL;605struct rbug_proto_context_draw_rule *ret;606607if (!header)608return NULL;609if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_RULE)610return NULL;611612pos = 0;613len = header->length * 4;614data = (uint8_t*)&header[1];615ret = MALLOC(sizeof(*ret));616if (!ret)617return NULL;618619ret->header.__message = header;620ret->header.opcode = header->opcode;621622READ(8, rbug_context_t, context); /* context */623READ(8, rbug_shader_t, vertex); /* vertex */624READ(8, rbug_shader_t, fragment); /* fragment */625READ(8, rbug_texture_t, texture); /* texture */626READ(8, rbug_texture_t, surface); /* surface */627READ(4, rbug_block_t, block); /* block */628629return ret;630}631632struct rbug_proto_context_flush * rbug_demarshal_context_flush(struct rbug_proto_header *header)633{634uint32_t len = 0;635uint32_t pos = 0;636uint8_t *data = NULL;637struct rbug_proto_context_flush *ret;638639if (!header)640return NULL;641if (header->opcode != (int32_t)RBUG_OP_CONTEXT_FLUSH)642return NULL;643644pos = 0;645len = header->length * 4;646data = (uint8_t*)&header[1];647ret = MALLOC(sizeof(*ret));648if (!ret)649return NULL;650651ret->header.__message = header;652ret->header.opcode = header->opcode;653654READ(8, rbug_context_t, context); /* context */655656return ret;657}658659struct rbug_proto_context_list_reply * rbug_demarshal_context_list_reply(struct rbug_proto_header *header)660{661uint32_t len = 0;662uint32_t pos = 0;663uint8_t *data = NULL;664struct rbug_proto_context_list_reply *ret;665666if (!header)667return NULL;668if (header->opcode != (int32_t)RBUG_OP_CONTEXT_LIST_REPLY)669return NULL;670671pos = 0;672len = header->length * 4;673data = (uint8_t*)&header[1];674ret = MALLOC(sizeof(*ret));675if (!ret)676return NULL;677678ret->header.__message = header;679ret->header.opcode = header->opcode;680681READ(4, uint32_t, serial); /* serial */682READ_ARRAY(8, rbug_context_t, contexts); /* contexts */683684return ret;685}686687struct rbug_proto_context_info_reply * rbug_demarshal_context_info_reply(struct rbug_proto_header *header)688{689uint32_t len = 0;690uint32_t pos = 0;691uint8_t *data = NULL;692struct rbug_proto_context_info_reply *ret;693694if (!header)695return NULL;696if (header->opcode != (int32_t)RBUG_OP_CONTEXT_INFO_REPLY)697return NULL;698699pos = 0;700len = header->length * 4;701data = (uint8_t*)&header[1];702ret = MALLOC(sizeof(*ret));703if (!ret)704return NULL;705706ret->header.__message = header;707ret->header.opcode = header->opcode;708709READ(4, uint32_t, serial); /* serial */710READ(8, rbug_shader_t, vertex); /* vertex */711READ(8, rbug_shader_t, fragment); /* fragment */712READ_ARRAY(8, rbug_texture_t, texs); /* texs */713READ_ARRAY(8, rbug_texture_t, cbufs); /* cbufs */714READ(8, rbug_texture_t, zsbuf); /* zsbuf */715READ(4, rbug_block_t, blocker); /* blocker */716READ(4, rbug_block_t, blocked); /* blocked */717718return ret;719}720721struct rbug_proto_context_draw_blocked * rbug_demarshal_context_draw_blocked(struct rbug_proto_header *header)722{723uint32_t len = 0;724uint32_t pos = 0;725uint8_t *data = NULL;726struct rbug_proto_context_draw_blocked *ret;727728if (!header)729return NULL;730if (header->opcode != (int32_t)RBUG_OP_CONTEXT_DRAW_BLOCKED)731return NULL;732733pos = 0;734len = header->length * 4;735data = (uint8_t*)&header[1];736ret = MALLOC(sizeof(*ret));737if (!ret)738return NULL;739740ret->header.__message = header;741ret->header.opcode = header->opcode;742743READ(8, rbug_context_t, context); /* context */744READ(4, rbug_block_t, block); /* block */745746return ret;747}748749750