static gceSTATUS _GetUserDebugOption( IN gcoHAL Hal ) { static gctINT envChecked = 0; if (!envChecked) { char* p = gcvNULL; gctSTRING pos = gcvNULL; gcoOS_GetEnv(gcvNULL, "VIV_DEBUG", &p); if (p) { gcoOS_StrStr(p, "MSG_LEVEL", &pos); if (pos) { pos += sizeof("MSG_LEVEL") - 1; while (pos[0] == '=') { ++pos; if (gcvSTATUS_OK == gcoOS_StrNCmp(pos, "ERROR", sizeof("ERROR") - 1)) { /* Output error messages. */ gcUserDebugOption.debugMsg = gcvDEBUG_MSG_ERROR; pos += sizeof("ERROR") - 1; } else if (gcvSTATUS_OK == gcoOS_StrNCmp(pos, "WARNING", sizeof("WARNING") - 1)) { /* Output error messages. */ gcUserDebugOption.debugMsg = gcvDEBUG_MSG_WARNING; pos += sizeof("WARNING") - 1; } } } } } Hal->userDebugOption = &gcUserDebugOption; return gcvSTATUS_OK; }
gceSTATUS gcoPROFILER_Initialize( IN gcoHAL Hal ) { gceSTATUS status = gcvSTATUS_OK; char* fileName; char* filter = gcvNULL; gctSTRING portName; gctINT port; gcsHAL_INTERFACE iface; gcmHEADER(); /* Check if already initialized. */ if (gcPLS.hal->profiler.enable) { gcPLS.hal->profiler.enable++; gcmFOOTER(); return status; } /* Get profile setting. */ iface.command = gcvHAL_GET_PROFILE_SETTING; /* Call the kernel. */ status = gcoOS_DeviceControl(gcvNULL, IOCTL_GCHAL_INTERFACE, &iface, gcmSIZEOF(iface), &iface, gcmSIZEOF(iface)); if (gcmIS_ERROR(status) || !iface.u.GetProfileSetting.enable) { gcPLS.hal->profiler.enable = 0; status = gcvSTATUS_GENERIC_IO; gcmFOOTER(); return status; } gcmVERIFY_OK(gcoOS_ZeroMemory(&gcPLS.hal->profiler, gcmSIZEOF(gcPLS.hal->profiler))); gcoOS_GetEnv(gcvNULL, "VP_COUNTER_FILTER", &filter); /* Enable/Disable specific counters. */ if ((filter != gcvNULL)) { gctSIZE_T bitsLen; gcoOS_StrLen(filter, &bitsLen); if (bitsLen > 2) { gcPLS.hal->profiler.enableHal = (filter[2] == '1'); } else { gcPLS.hal->profiler.enableHal = gcvTRUE; } if (bitsLen > 3) { gcPLS.hal->profiler.enableHW = (filter[3] == '1'); } else { gcPLS.hal->profiler.enableHW = gcvTRUE; } if (bitsLen > 8) { gcPLS.hal->profiler.enableSH = (filter[8] == '1'); } else { gcPLS.hal->profiler.enableSH = gcvTRUE; } } else { gcPLS.hal->profiler.enableHal = gcvTRUE; gcPLS.hal->profiler.enableHW = gcvTRUE; gcPLS.hal->profiler.enableSH = gcvTRUE; } gcoOS_GetEnv(gcvNULL, "VPROFILER_OUTPUT", &fileName); gcPLS.hal->profiler.useSocket = gcvFALSE; if (fileName && *fileName != '\0' && *fileName != ' ') { /* Extract port info. */ gcoOS_StrFindReverse(fileName, ':', &portName); if (portName) { gcoOS_StrToInt(portName + 1, &port); if (port > 0) { /*status = gcoOS_Socket(gcvNULL, AF_INET, SOCK_STREAM, 0, &gcPLS.hal->profiler.sockFd);*/ status = gcoOS_Socket(gcvNULL, 2, 1, 0, &gcPLS.hal->profiler.sockFd); if (gcmIS_SUCCESS(status)) { *portName = '\0'; status = gcoOS_Connect(gcvNULL, gcPLS.hal->profiler.sockFd, fileName, port); *portName = ':'; if (gcmIS_SUCCESS(status)) { gcPLS.hal->profiler.useSocket = gcvTRUE; } } } } } else { fileName = iface.u.GetProfileSetting.fileName; } if (! gcPLS.hal->profiler.useSocket) { status = gcoOS_Open(gcvNULL, fileName, #ifdef gcdNEW_PROFILER_FILE gcvFILE_CREATE, #else gcvFILE_CREATETEXT, #endif &gcPLS.hal->profiler.file); } if (gcmIS_ERROR(status)) { gcPLS.hal->profiler.enable = 0; status = gcvSTATUS_GENERIC_IO; gcmFOOTER(); return status; } gcPLS.hal->profiler.enable = 1; gcoOS_GetTime(&gcPLS.hal->profiler.frameStart); gcPLS.hal->profiler.frameStartTimeusec = gcPLS.hal->profiler.frameStart; gcPLS.hal->profiler.prevVSInstCount = 0; gcPLS.hal->profiler.prevVSBranchInstCount = 0; gcPLS.hal->profiler.prevVSTexInstCount = 0; gcPLS.hal->profiler.prevVSVertexCount = 0; gcPLS.hal->profiler.prevPSInstCount = 0; gcPLS.hal->profiler.prevPSBranchInstCount = 0; gcPLS.hal->profiler.prevPSTexInstCount = 0; gcPLS.hal->profiler.prevPSPixelCount = 0; #if gcdNEW_PROFILER_FILE gcmWRITE_CONST(VPHEADER); gcmWRITE_BUFFER(4, "VP12"); #else gcmWRITE_STRING("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<VProfile>\n"); #endif /* Success. */ gcmFOOTER(); return status; }
/******************************************************************************* ** InitializeVGProfiler ** ** Initialize the profiler for the context provided. ** ** Arguments: ** ** VGContext Context ** Pointer to a new VGContext object. */ void InitializeVGProfiler( _VGContext * Context ) { gceSTATUS status; gctUINT rev; char *env; status = gcoPROFILER_Initialize(Context->hal); if (gcmIS_ERROR(status)) { Context->profiler.enable = gcvFALSE; return; } /* Clear the profiler. */ gcmVERIFY_OK( gcoOS_ZeroMemory(&Context->profiler, gcmSIZEOF(Context->profiler))); gcoOS_GetEnv(Context->os, "VP_COUNTER_FILTER", &env); if ((env == gcvNULL) || (env[0] ==0)) { Context->profiler.drvEnable = Context->profiler.timeEnable = Context->profiler.memEnable = gcvTRUE; } else { gctSIZE_T bitsLen; gcoOS_StrLen(env, &bitsLen); if (bitsLen > 0) { Context->profiler.timeEnable = (env[0] == '1'); } else { Context->profiler.timeEnable = gcvTRUE; } if (bitsLen > 1) { Context->profiler.memEnable = (env[1] == '1'); } else { Context->profiler.memEnable = gcvTRUE; } if (bitsLen > 4) { Context->profiler.drvEnable = (env[4] == '1'); } else { Context->profiler.drvEnable = gcvTRUE; } } Context->profiler.enable = gcvTRUE; #if gcdNEW_PROFILER_FILE { /* Write Generic Info. */ char* infoCompany = "Vivante Corporation"; char* infoVersion = "1.0"; char infoRevision[255] = {'\0'}; /* read from hw */ char* infoRenderer = Context->chipName; char* infoDriver = "OpenVG 1.1"; gctUINT offset = 0; rev = Context->revision; #define BCD(digit) ((rev >> (digit * 4)) & 0xF) gcoOS_MemFill(infoRevision, 0, gcmSIZEOF(infoRevision)); gcoOS_MemFill(infoRevision, 0, gcmSIZEOF(infoRevision)); if (BCD(3) == 0) { /* Old format. */ gcoOS_PrintStrSafe(infoRevision, gcmSIZEOF(infoRevision), &offset, "revision=\"%d.%d\" ", BCD(1), BCD(0)); } else { /* New format. */ gcoOS_PrintStrSafe(infoRevision, gcmSIZEOF(infoRevision), &offset, "revision=\"%d.%d.%d_rc%d\" ", BCD(3), BCD(2), BCD(1), BCD(0)); } gcmWRITE_CONST(VPG_INFO); gcmWRITE_CONST(VPC_INFOCOMPANY); gcmWRITE_STRING(infoCompany); gcmWRITE_CONST(VPC_INFOVERSION); gcmWRITE_STRING(infoVersion); gcmWRITE_CONST(VPC_INFORENDERER); gcmWRITE_STRING(infoRenderer); gcmWRITE_CONST(VPC_INFOREVISION); gcmWRITE_STRING(infoRevision); gcmWRITE_CONST(VPC_INFODRIVER); gcmWRITE_STRING(infoDriver); gcmWRITE_CONST(VPG_END); } #else /* Print generic info */ _Print(Context, "<GenericInfo company=\"Vivante Corporation\" " "version=\"%d.%d\" renderer=\"%s\" ", 1, 0, Context->chipName); rev = Context->revision; #define BCD(digit) ((rev >> (digit * 4)) & 0xF) if (BCD(3) == 0) { /* Old format. */ _Print(Context, "revision=\"%d.%d\" ", BCD(1), BCD(0)); } else { /* New format. */ _Print(Context, "revision=\"%d.%d.%d_rc%d\" ", BCD(3), BCD(2), BCD(1), BCD(0)); } _Print(Context, "driver=\"%s\" />\n", "OpenVG 1.1"); #endif gcoOS_GetTime(&Context->profiler.frameStart); Context->profiler.frameStartTimeusec = Context->profiler.frameStart; Context->profiler.primitiveStartTimeusec = Context->profiler.frameStart; gcoOS_GetCPUTime(&Context->profiler.frameStartCPUTimeusec); }