Path: blob/21.2-virgl/src/gallium/auxiliary/rbug/rbug_texture.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 "c99_alloca.h"3738#include "rbug_internal.h"39#include "rbug_texture.h"4041int rbug_send_texture_list(struct rbug_connection *__con,42uint32_t *__serial)43{44uint32_t __len = 0;45uint32_t __pos = 0;46uint8_t *__data = NULL;47int __ret = 0;4849LEN(8); /* header */5051/* align */52PAD(__len, 8);5354__data = (uint8_t*)MALLOC(__len);55if (!__data)56return -ENOMEM;5758WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_LIST));59WRITE(4, uint32_t, ((uint32_t)(__len / 4)));6061/* final pad */62PAD(__pos, 8);6364if (__pos != __len) {65__ret = -EINVAL;66} else {67rbug_connection_send_start(__con, RBUG_OP_TEXTURE_LIST, __len);68rbug_connection_write(__con, __data, __len);69__ret = rbug_connection_send_finish(__con, __serial);70}7172FREE(__data);73return __ret;74}7576int rbug_send_texture_info(struct rbug_connection *__con,77rbug_texture_t texture,78uint32_t *__serial)79{80uint32_t __len = 0;81uint32_t __pos = 0;82uint8_t *__data = NULL;83int __ret = 0;8485LEN(8); /* header */86LEN(8); /* texture */8788/* align */89PAD(__len, 8);9091__data = (uint8_t*)MALLOC(__len);92if (!__data)93return -ENOMEM;9495WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_INFO));96WRITE(4, uint32_t, ((uint32_t)(__len / 4)));97WRITE(8, rbug_texture_t, texture); /* texture */9899/* final pad */100PAD(__pos, 8);101102if (__pos != __len) {103__ret = -EINVAL;104} else {105rbug_connection_send_start(__con, RBUG_OP_TEXTURE_INFO, __len);106rbug_connection_write(__con, __data, __len);107__ret = rbug_connection_send_finish(__con, __serial);108}109110FREE(__data);111return __ret;112}113114int rbug_send_texture_write(struct rbug_connection *__con,115rbug_texture_t texture,116uint32_t face,117uint32_t level,118uint32_t zslice,119uint32_t x,120uint32_t y,121uint32_t w,122uint32_t h,123uint8_t *data,124uint32_t data_len,125uint32_t stride,126uint32_t *__serial)127{128uint32_t __len = 0;129uint32_t __pos = 0;130uint8_t *__data = NULL;131int __ret = 0;132133LEN(8); /* header */134LEN(8); /* texture */135LEN(4); /* face */136LEN(4); /* level */137LEN(4); /* zslice */138LEN(4); /* x */139LEN(4); /* y */140LEN(4); /* w */141LEN(4); /* h */142LEN_ARRAY(1, data); /* data */143LEN(4); /* stride */144145/* align */146PAD(__len, 8);147148__data = (uint8_t*)MALLOC(__len);149if (!__data)150return -ENOMEM;151152WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_WRITE));153WRITE(4, uint32_t, ((uint32_t)(__len / 4)));154WRITE(8, rbug_texture_t, texture); /* texture */155WRITE(4, uint32_t, face); /* face */156WRITE(4, uint32_t, level); /* level */157WRITE(4, uint32_t, zslice); /* zslice */158WRITE(4, uint32_t, x); /* x */159WRITE(4, uint32_t, y); /* y */160WRITE(4, uint32_t, w); /* w */161WRITE(4, uint32_t, h); /* h */162WRITE_ARRAY(1, uint8_t, data); /* data */163WRITE(4, uint32_t, stride); /* stride */164165/* final pad */166PAD(__pos, 8);167168if (__pos != __len) {169__ret = -EINVAL;170} else {171rbug_connection_send_start(__con, RBUG_OP_TEXTURE_WRITE, __len);172rbug_connection_write(__con, __data, __len);173__ret = rbug_connection_send_finish(__con, __serial);174}175176FREE(__data);177return __ret;178}179180int rbug_send_texture_read(struct rbug_connection *__con,181rbug_texture_t texture,182uint32_t face,183uint32_t level,184uint32_t zslice,185uint32_t x,186uint32_t y,187uint32_t w,188uint32_t h,189uint32_t *__serial)190{191uint32_t __len = 0;192uint32_t __pos = 0;193uint8_t *__data = NULL;194int __ret = 0;195196LEN(8); /* header */197LEN(8); /* texture */198LEN(4); /* face */199LEN(4); /* level */200LEN(4); /* zslice */201LEN(4); /* x */202LEN(4); /* y */203LEN(4); /* w */204LEN(4); /* h */205206/* align */207PAD(__len, 8);208209__data = (uint8_t*)MALLOC(__len);210if (!__data)211return -ENOMEM;212213WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_READ));214WRITE(4, uint32_t, ((uint32_t)(__len / 4)));215WRITE(8, rbug_texture_t, texture); /* texture */216WRITE(4, uint32_t, face); /* face */217WRITE(4, uint32_t, level); /* level */218WRITE(4, uint32_t, zslice); /* zslice */219WRITE(4, uint32_t, x); /* x */220WRITE(4, uint32_t, y); /* y */221WRITE(4, uint32_t, w); /* w */222WRITE(4, uint32_t, h); /* h */223224/* final pad */225PAD(__pos, 8);226227if (__pos != __len) {228__ret = -EINVAL;229} else {230rbug_connection_send_start(__con, RBUG_OP_TEXTURE_READ, __len);231rbug_connection_write(__con, __data, __len);232__ret = rbug_connection_send_finish(__con, __serial);233}234235FREE(__data);236return __ret;237}238239int rbug_send_texture_list_reply(struct rbug_connection *__con,240uint32_t serial,241rbug_texture_t *textures,242uint32_t textures_len,243uint32_t *__serial)244{245uint32_t __len = 0;246uint32_t __pos = 0;247uint8_t *__data = NULL;248int __ret = 0;249250LEN(8); /* header */251LEN(4); /* serial */252LEN_ARRAY(8, textures); /* textures */253254/* align */255PAD(__len, 8);256257__data = (uint8_t*)MALLOC(__len);258if (!__data)259return -ENOMEM;260261WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_LIST_REPLY));262WRITE(4, uint32_t, ((uint32_t)(__len / 4)));263WRITE(4, uint32_t, serial); /* serial */264WRITE_ARRAY(8, rbug_texture_t, textures); /* textures */265266/* final pad */267PAD(__pos, 8);268269if (__pos != __len) {270__ret = -EINVAL;271} else {272rbug_connection_send_start(__con, RBUG_OP_TEXTURE_LIST_REPLY, __len);273rbug_connection_write(__con, __data, __len);274__ret = rbug_connection_send_finish(__con, __serial);275}276277FREE(__data);278return __ret;279}280281int rbug_send_texture_info_reply(struct rbug_connection *__con,282uint32_t serial,283uint32_t target,284uint32_t format,285uint32_t *width,286uint32_t width_len,287uint16_t *h16,288uint32_t height_len,289uint16_t *d16,290uint32_t depth_len,291uint32_t blockw,292uint32_t blockh,293uint32_t blocksize,294uint32_t last_level,295uint32_t nr_samples,296uint32_t tex_usage,297uint32_t *__serial)298{299uint32_t __len = 0;300uint32_t __pos = 0;301uint8_t *__data = NULL;302int __ret = 0;303uint32_t *height = alloca(sizeof(uint32_t) * height_len);304uint32_t *depth = alloca(sizeof(uint32_t) * height_len);305306LEN(8); /* header */307LEN(4); /* serial */308LEN(4); /* target */309LEN(4); /* format */310LEN_ARRAY(4, width); /* width */311LEN_ARRAY(4, height); /* height */312LEN_ARRAY(4, depth); /* depth */313LEN(4); /* blockw */314LEN(4); /* blockh */315LEN(4); /* blocksize */316LEN(4); /* last_level */317LEN(4); /* nr_samples */318LEN(4); /* tex_usage */319320/* align */321PAD(__len, 8);322323__data = (uint8_t*)MALLOC(__len);324if (!__data)325return -ENOMEM;326327for (int i = 0; i < height_len; i++)328height[i] = h16[i];329for (int i = 0; i < depth_len; i++)330depth[i] = d16[i];331332WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_INFO_REPLY));333WRITE(4, uint32_t, ((uint32_t)(__len / 4)));334WRITE(4, uint32_t, serial); /* serial */335WRITE(4, uint32_t, target); /* target */336WRITE(4, uint32_t, format); /* format */337WRITE_ARRAY(4, uint32_t, width); /* width */338WRITE_ARRAY(4, uint32_t, height); /* height */339WRITE_ARRAY(4, uint32_t, depth); /* depth */340WRITE(4, uint32_t, blockw); /* blockw */341WRITE(4, uint32_t, blockh); /* blockh */342WRITE(4, uint32_t, blocksize); /* blocksize */343WRITE(4, uint32_t, last_level); /* last_level */344WRITE(4, uint32_t, nr_samples); /* nr_samples */345WRITE(4, uint32_t, tex_usage); /* tex_usage */346347/* final pad */348PAD(__pos, 8);349350if (__pos != __len) {351__ret = -EINVAL;352} else {353rbug_connection_send_start(__con, RBUG_OP_TEXTURE_INFO_REPLY, __len);354rbug_connection_write(__con, __data, __len);355__ret = rbug_connection_send_finish(__con, __serial);356}357358FREE(__data);359return __ret;360}361362int rbug_send_texture_read_reply(struct rbug_connection *__con,363uint32_t serial,364uint32_t format,365uint32_t blockw,366uint32_t blockh,367uint32_t blocksize,368uint8_t *data,369uint32_t data_len,370uint32_t stride,371uint32_t *__serial)372{373uint32_t __len = 0;374uint32_t __pos = 0;375uint8_t *__data = NULL;376int __ret = 0;377378LEN(8); /* header */379LEN(4); /* serial */380LEN(4); /* format */381LEN(4); /* blockw */382LEN(4); /* blockh */383LEN(4); /* blocksize */384LEN_ARRAY(1, data); /* data */385LEN(4); /* stride */386387/* align */388PAD(__len, 8);389390__data = (uint8_t*)MALLOC(__len);391if (!__data)392return -ENOMEM;393394WRITE(4, int32_t, ((int32_t)RBUG_OP_TEXTURE_READ_REPLY));395WRITE(4, uint32_t, ((uint32_t)(__len / 4)));396WRITE(4, uint32_t, serial); /* serial */397WRITE(4, uint32_t, format); /* format */398WRITE(4, uint32_t, blockw); /* blockw */399WRITE(4, uint32_t, blockh); /* blockh */400WRITE(4, uint32_t, blocksize); /* blocksize */401WRITE_ARRAY(1, uint8_t, data); /* data */402WRITE(4, uint32_t, stride); /* stride */403404/* final pad */405PAD(__pos, 8);406407if (__pos != __len) {408__ret = -EINVAL;409} else {410rbug_connection_send_start(__con, RBUG_OP_TEXTURE_READ_REPLY, __len);411rbug_connection_write(__con, __data, __len);412__ret = rbug_connection_send_finish(__con, __serial);413}414415FREE(__data);416return __ret;417}418419struct rbug_proto_texture_list * rbug_demarshal_texture_list(struct rbug_proto_header *header)420{421struct rbug_proto_texture_list *ret;422423if (!header)424return NULL;425if (header->opcode != (int32_t)RBUG_OP_TEXTURE_LIST)426return NULL;427428ret = MALLOC(sizeof(*ret));429if (!ret)430return NULL;431432ret->header.__message = header;433ret->header.opcode = header->opcode;434435return ret;436}437438struct rbug_proto_texture_info * rbug_demarshal_texture_info(struct rbug_proto_header *header)439{440uint32_t len = 0;441uint32_t pos = 0;442uint8_t *data = NULL;443struct rbug_proto_texture_info *ret;444445if (!header)446return NULL;447if (header->opcode != (int32_t)RBUG_OP_TEXTURE_INFO)448return NULL;449450pos = 0;451len = header->length * 4;452data = (uint8_t*)&header[1];453ret = MALLOC(sizeof(*ret));454if (!ret)455return NULL;456457ret->header.__message = header;458ret->header.opcode = header->opcode;459460READ(8, rbug_texture_t, texture); /* texture */461462return ret;463}464465struct rbug_proto_texture_write * rbug_demarshal_texture_write(struct rbug_proto_header *header)466{467uint32_t len = 0;468uint32_t pos = 0;469uint8_t *data = NULL;470struct rbug_proto_texture_write *ret;471472if (!header)473return NULL;474if (header->opcode != (int32_t)RBUG_OP_TEXTURE_WRITE)475return NULL;476477pos = 0;478len = header->length * 4;479data = (uint8_t*)&header[1];480ret = MALLOC(sizeof(*ret));481if (!ret)482return NULL;483484ret->header.__message = header;485ret->header.opcode = header->opcode;486487READ(8, rbug_texture_t, texture); /* texture */488READ(4, uint32_t, face); /* face */489READ(4, uint32_t, level); /* level */490READ(4, uint32_t, zslice); /* zslice */491READ(4, uint32_t, x); /* x */492READ(4, uint32_t, y); /* y */493READ(4, uint32_t, w); /* w */494READ(4, uint32_t, h); /* h */495READ_ARRAY(1, uint8_t, data); /* data */496READ(4, uint32_t, stride); /* stride */497498return ret;499}500501struct rbug_proto_texture_read * rbug_demarshal_texture_read(struct rbug_proto_header *header)502{503uint32_t len = 0;504uint32_t pos = 0;505uint8_t *data = NULL;506struct rbug_proto_texture_read *ret;507508if (!header)509return NULL;510if (header->opcode != (int32_t)RBUG_OP_TEXTURE_READ)511return NULL;512513pos = 0;514len = header->length * 4;515data = (uint8_t*)&header[1];516ret = MALLOC(sizeof(*ret));517if (!ret)518return NULL;519520ret->header.__message = header;521ret->header.opcode = header->opcode;522523READ(8, rbug_texture_t, texture); /* texture */524READ(4, uint32_t, face); /* face */525READ(4, uint32_t, level); /* level */526READ(4, uint32_t, zslice); /* zslice */527READ(4, uint32_t, x); /* x */528READ(4, uint32_t, y); /* y */529READ(4, uint32_t, w); /* w */530READ(4, uint32_t, h); /* h */531532return ret;533}534535struct rbug_proto_texture_list_reply * rbug_demarshal_texture_list_reply(struct rbug_proto_header *header)536{537uint32_t len = 0;538uint32_t pos = 0;539uint8_t *data = NULL;540struct rbug_proto_texture_list_reply *ret;541542if (!header)543return NULL;544if (header->opcode != (int32_t)RBUG_OP_TEXTURE_LIST_REPLY)545return NULL;546547pos = 0;548len = header->length * 4;549data = (uint8_t*)&header[1];550ret = MALLOC(sizeof(*ret));551if (!ret)552return NULL;553554ret->header.__message = header;555ret->header.opcode = header->opcode;556557READ(4, uint32_t, serial); /* serial */558READ_ARRAY(8, rbug_texture_t, textures); /* textures */559560return ret;561}562563struct rbug_proto_texture_info_reply * rbug_demarshal_texture_info_reply(struct rbug_proto_header *header)564{565uint32_t len = 0;566uint32_t pos = 0;567uint8_t *data = NULL;568struct rbug_proto_texture_info_reply *ret;569570if (!header)571return NULL;572if (header->opcode != (int32_t)RBUG_OP_TEXTURE_INFO_REPLY)573return NULL;574575pos = 0;576len = header->length * 4;577data = (uint8_t*)&header[1];578ret = MALLOC(sizeof(*ret));579if (!ret)580return NULL;581582ret->header.__message = header;583ret->header.opcode = header->opcode;584585READ(4, uint32_t, serial); /* serial */586READ(4, uint32_t, target); /* target */587READ(4, uint32_t, format); /* format */588READ_ARRAY(4, uint32_t, width); /* width */589READ_ARRAY(4, uint32_t, height); /* height */590READ_ARRAY(4, uint32_t, depth); /* depth */591READ(4, uint32_t, blockw); /* blockw */592READ(4, uint32_t, blockh); /* blockh */593READ(4, uint32_t, blocksize); /* blocksize */594READ(4, uint32_t, last_level); /* last_level */595READ(4, uint32_t, nr_samples); /* nr_samples */596READ(4, uint32_t, tex_usage); /* tex_usage */597598return ret;599}600601struct rbug_proto_texture_read_reply * rbug_demarshal_texture_read_reply(struct rbug_proto_header *header)602{603uint32_t len = 0;604uint32_t pos = 0;605uint8_t *data = NULL;606struct rbug_proto_texture_read_reply *ret;607608if (!header)609return NULL;610if (header->opcode != (int32_t)RBUG_OP_TEXTURE_READ_REPLY)611return NULL;612613pos = 0;614len = header->length * 4;615data = (uint8_t*)&header[1];616ret = MALLOC(sizeof(*ret));617if (!ret)618return NULL;619620ret->header.__message = header;621ret->header.opcode = header->opcode;622623READ(4, uint32_t, serial); /* serial */624READ(4, uint32_t, format); /* format */625READ(4, uint32_t, blockw); /* blockw */626READ(4, uint32_t, blockh); /* blockh */627READ(4, uint32_t, blocksize); /* blocksize */628READ_ARRAY(1, uint8_t, data); /* data */629READ(4, uint32_t, stride); /* stride */630631return ret;632}633634635