Path: blob/21.2-virgl/src/gallium/drivers/nouveau/codegen/nv50_ir_serialize.cpp
4574 views
#include "util/blob.h"1#include "codegen/nv50_ir_driver.h"2#include "codegen/nv50_ir.h"3#include "codegen/nv50_ir_target.h"4#include "nv50_ir_driver.h"5#include "tgsi/tgsi_parse.h"6#include "compiler/nir/nir_serialize.h"78enum FixupApplyFunc {9APPLY_NV50,10APPLY_NVC0,11APPLY_GK110,12APPLY_GM107,13APPLY_GV100,14FLIP_NVC0,15FLIP_GK110,16FLIP_GM107,17FLIP_GV100,18};1920extern bool21nv50_ir_prog_info_serialize(struct blob *blob, struct nv50_ir_prog_info *info)22{23blob_write_uint32(blob, info->bin.smemSize);24blob_write_uint16(blob, info->target);25blob_write_uint8(blob, info->type);26blob_write_uint8(blob, info->optLevel);27blob_write_uint8(blob, info->dbgFlags);28blob_write_uint8(blob, info->omitLineNum);29blob_write_uint8(blob, info->bin.sourceRep);3031switch(info->bin.sourceRep) {32case PIPE_SHADER_IR_TGSI: {33struct tgsi_token *tokens = (struct tgsi_token *)info->bin.source;34unsigned int num_tokens = tgsi_num_tokens(tokens);3536blob_write_uint32(blob, num_tokens);37blob_write_bytes(blob, tokens, num_tokens * sizeof(struct tgsi_token));38break;39}40case PIPE_SHADER_IR_NIR: {41struct nir_shader *nir = (struct nir_shader *)info->bin.source;42nir_serialize(blob, nir, true);43break;44}45default:46ERROR("unhandled info->bin.sourceRep switch case\n");47assert(false);48return false;49}5051if (info->type == PIPE_SHADER_COMPUTE)52blob_write_bytes(blob, &info->prop.cp, sizeof(info->prop.cp));5354blob_write_bytes(blob, &info->io, sizeof(info->io));5556return true;57}5859extern bool60nv50_ir_prog_info_out_serialize(struct blob *blob,61struct nv50_ir_prog_info_out *info_out)62{63blob_write_uint16(blob, info_out->target);64blob_write_uint8(blob, info_out->type);65blob_write_uint8(blob, info_out->numPatchConstants);6667blob_write_uint16(blob, info_out->bin.maxGPR);68blob_write_uint32(blob, info_out->bin.tlsSpace);69blob_write_uint32(blob, info_out->bin.smemSize);70blob_write_uint32(blob, info_out->bin.codeSize);71blob_write_bytes(blob, info_out->bin.code, info_out->bin.codeSize);72blob_write_uint32(blob, info_out->bin.instructions);7374if (!info_out->bin.relocData) {75blob_write_uint32(blob, 0); // reloc count 076} else {77nv50_ir::RelocInfo *reloc = (nv50_ir::RelocInfo *)info_out->bin.relocData;78blob_write_uint32(blob, reloc->count);79blob_write_uint32(blob, reloc->codePos);80blob_write_uint32(blob, reloc->libPos);81blob_write_uint32(blob, reloc->dataPos);82blob_write_bytes(blob, reloc->entry, sizeof(*reloc->entry) * reloc->count);83}8485if (!info_out->bin.fixupData) {86blob_write_uint32(blob, 0); // fixup count 087} else {88nv50_ir::FixupInfo *fixup = (nv50_ir::FixupInfo *)info_out->bin.fixupData;89blob_write_uint32(blob, fixup->count);9091/* Going through each entry */92for (uint32_t i = 0; i < fixup->count; i++) {93blob_write_uint32(blob, fixup->entry[i].val);94assert(fixup->entry[i].apply);95/* Compare function pointers, for when at serializing96* to know which function to apply */97if (fixup->entry[i].apply == nv50_ir::nv50_interpApply)98blob_write_uint8(blob, APPLY_NV50);99else if (fixup->entry[i].apply == nv50_ir::nvc0_interpApply)100blob_write_uint8(blob, APPLY_NVC0);101else if (fixup->entry[i].apply == nv50_ir::gk110_interpApply)102blob_write_uint8(blob, APPLY_GK110);103else if (fixup->entry[i].apply == nv50_ir::gm107_interpApply)104blob_write_uint8(blob, APPLY_GM107);105else if (fixup->entry[i].apply == nv50_ir::gv100_interpApply)106blob_write_uint8(blob, APPLY_GV100);107else if (fixup->entry[i].apply == nv50_ir::nvc0_selpFlip)108blob_write_uint8(blob, FLIP_NVC0);109else if (fixup->entry[i].apply == nv50_ir::gk110_selpFlip)110blob_write_uint8(blob, FLIP_GK110);111else if (fixup->entry[i].apply == nv50_ir::gm107_selpFlip)112blob_write_uint8(blob, FLIP_GM107);113else if (fixup->entry[i].apply == nv50_ir::gv100_selpFlip)114blob_write_uint8(blob, FLIP_GV100);115else {116ERROR("unhandled fixup apply function pointer\n");117assert(false);118return false;119}120}121}122123blob_write_uint8(blob, info_out->numInputs);124blob_write_uint8(blob, info_out->numOutputs);125blob_write_uint8(blob, info_out->numSysVals);126blob_write_bytes(blob, info_out->sv, info_out->numSysVals * sizeof(info_out->sv[0]));127blob_write_bytes(blob, info_out->in, info_out->numInputs * sizeof(info_out->in[0]));128blob_write_bytes(blob, info_out->out, info_out->numOutputs * sizeof(info_out->out[0]));129130switch(info_out->type) {131case PIPE_SHADER_VERTEX:132blob_write_bytes(blob, &info_out->prop.vp, sizeof(info_out->prop.vp));133break;134case PIPE_SHADER_TESS_CTRL:135case PIPE_SHADER_TESS_EVAL:136blob_write_bytes(blob, &info_out->prop.tp, sizeof(info_out->prop.tp));137break;138case PIPE_SHADER_GEOMETRY:139blob_write_bytes(blob, &info_out->prop.gp, sizeof(info_out->prop.gp));140break;141case PIPE_SHADER_FRAGMENT:142blob_write_bytes(blob, &info_out->prop.fp, sizeof(info_out->prop.fp));143break;144case PIPE_SHADER_COMPUTE:145blob_write_bytes(blob, &info_out->prop.cp, sizeof(info_out->prop.cp));146break;147default:148break;149}150blob_write_bytes(blob, &info_out->io, sizeof(info_out->io));151blob_write_uint8(blob, info_out->numBarriers);152153return true;154}155156extern bool157nv50_ir_prog_info_out_deserialize(void *data, size_t size, size_t offset,158struct nv50_ir_prog_info_out *info_out)159{160struct blob_reader reader;161blob_reader_init(&reader, data, size);162blob_skip_bytes(&reader, offset);163164info_out->target = blob_read_uint16(&reader);165info_out->type = blob_read_uint8(&reader);166info_out->numPatchConstants = blob_read_uint8(&reader);167168info_out->bin.maxGPR = blob_read_uint16(&reader);169info_out->bin.tlsSpace = blob_read_uint32(&reader);170info_out->bin.smemSize = blob_read_uint32(&reader);171info_out->bin.codeSize = blob_read_uint32(&reader);172info_out->bin.code = (uint32_t *)MALLOC(info_out->bin.codeSize);173blob_copy_bytes(&reader, info_out->bin.code, info_out->bin.codeSize);174info_out->bin.instructions = blob_read_uint32(&reader);175176info_out->bin.relocData = NULL;177/* Check if data contains RelocInfo */178uint32_t count = blob_read_uint32(&reader);179if (count) {180nv50_ir::RelocInfo *reloc =181CALLOC_VARIANT_LENGTH_STRUCT(nv50_ir::RelocInfo,182count * sizeof(*reloc->entry));183reloc->codePos = blob_read_uint32(&reader);184reloc->libPos = blob_read_uint32(&reader);185reloc->dataPos = blob_read_uint32(&reader);186reloc->count = count;187188blob_copy_bytes(&reader, reloc->entry, sizeof(*reloc->entry) * reloc->count);189info_out->bin.relocData = reloc;190}191192info_out->bin.fixupData = NULL;193/* Check if data contains FixupInfo */194count = blob_read_uint32(&reader);195if (count) {196nv50_ir::FixupInfo *fixup =197CALLOC_VARIANT_LENGTH_STRUCT(nv50_ir::FixupInfo,198count * sizeof(*fixup->entry));199fixup->count = count;200201for (uint32_t i = 0; i < count; i++) {202fixup->entry[i].val = blob_read_uint32(&reader);203204/* Assign back function pointer depending on stored enum */205enum FixupApplyFunc apply = (enum FixupApplyFunc)blob_read_uint8(&reader);206switch(apply) {207case APPLY_NV50:208fixup->entry[i].apply = nv50_ir::nv50_interpApply;209break;210case APPLY_NVC0:211fixup->entry[i].apply = nv50_ir::nvc0_interpApply;212break;213case APPLY_GK110:214fixup->entry[i].apply = nv50_ir::gk110_interpApply;215break;216case APPLY_GM107:217fixup->entry[i].apply = nv50_ir::gm107_interpApply;218break;219case APPLY_GV100:220fixup->entry[i].apply = nv50_ir::gv100_interpApply;221break;222case FLIP_NVC0:223fixup->entry[i].apply = nv50_ir::nvc0_selpFlip;224break;225case FLIP_GK110:226fixup->entry[i].apply = nv50_ir::gk110_selpFlip;227break;228case FLIP_GM107:229fixup->entry[i].apply = nv50_ir::gm107_selpFlip;230break;231case FLIP_GV100:232fixup->entry[i].apply = nv50_ir::gv100_selpFlip;233break;234default:235ERROR("unhandled fixup apply function switch case");236assert(false);237return false;238}239}240info_out->bin.fixupData = fixup;241}242243info_out->numInputs = blob_read_uint8(&reader);244info_out->numOutputs = blob_read_uint8(&reader);245info_out->numSysVals = blob_read_uint8(&reader);246blob_copy_bytes(&reader, info_out->sv, info_out->numSysVals * sizeof(info_out->sv[0]));247blob_copy_bytes(&reader, info_out->in, info_out->numInputs * sizeof(info_out->in[0]));248blob_copy_bytes(&reader, info_out->out, info_out->numOutputs * sizeof(info_out->out[0]));249250switch(info_out->type) {251case PIPE_SHADER_VERTEX:252blob_copy_bytes(&reader, &info_out->prop.vp, sizeof(info_out->prop.vp));253break;254case PIPE_SHADER_TESS_CTRL:255case PIPE_SHADER_TESS_EVAL:256blob_copy_bytes(&reader, &info_out->prop.tp, sizeof(info_out->prop.tp));257break;258case PIPE_SHADER_GEOMETRY:259blob_copy_bytes(&reader, &info_out->prop.gp, sizeof(info_out->prop.gp));260break;261case PIPE_SHADER_FRAGMENT:262blob_copy_bytes(&reader, &info_out->prop.fp, sizeof(info_out->prop.fp));263break;264case PIPE_SHADER_COMPUTE:265blob_copy_bytes(&reader, &info_out->prop.cp, sizeof(info_out->prop.cp));266break;267default:268break;269}270blob_copy_bytes(&reader, &(info_out->io), sizeof(info_out->io));271info_out->numBarriers = blob_read_uint8(&reader);272273return true;274}275276277