X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_parser.cpp;h=0e4fba098db597d4e782251e7149d7c36ee80a0c;hb=5871eadbe7651f4cf26dd757f7a94997d8d3ab2f;hp=dc9634f0d36f823b635d26c7efd7bc1a1082625f;hpb=a5b476eb4eed9b06e22f4a80b16251aea243207d;p=apitrace diff --git a/common/trace_parser.cpp b/common/trace_parser.cpp index dc9634f..0e4fba0 100644 --- a/common/trace_parser.cpp +++ b/common/trace_parser.cpp @@ -43,6 +43,7 @@ Parser::Parser() { file = NULL; next_call_no = 0; version = 0; + api = API_UNKNOWN; glGetErrorSig = NULL; } @@ -65,6 +66,7 @@ bool Parser::open(const char *filename) { std::cerr << "error: unsupported trace format version " << version << "\n"; return false; } + api = API_UNKNOWN; return true; } @@ -232,6 +234,29 @@ Parser::parse_function_sig(void) { sig->offset = file->currentOffset(); functions[id] = sig; + /** + * Try to autodetect the API. + * + * XXX: Ideally we would allow to mix multiple APIs in a single trace, + * but as it stands today, retrace is done separately for each API. + */ + if (api == API_UNKNOWN) { + const char *n = sig->name; + if ((n[0] == 'g' && n[1] == 'l' && n[2] == 'X') || // glX* + (n[0] == 'w' && n[1] == 'g' && n[2] == 'l' && n[3] >= 'A' && n[3] <= 'Z') || // wgl[A-Z]* + (n[0] == 'C' && n[1] == 'G' && n[2] == 'L')) { // CGL* + api = trace::API_GL; + } else if (n[0] == 'e' && n[1] == 'g' && n[2] == 'l' && n[3] >= 'A' && n[3] <= 'Z') { // egl[A-Z]* + api = trace::API_EGL; + } else if (n[0] == 'D' && + ((n[1] == 'i' && n[2] == 'r' && n[3] == 'e' && n[4] == 'c' && n[5] == 't') || // Direct* + (n[1] == '3' && n[2] == 'D'))) { // D3D* + api = trace::API_DX; + } else { + /* TODO */ + } + } + /** * Note down the signature of special functions for future reference. * @@ -713,7 +738,7 @@ Value *Parser::parse_blob(void) { size_t size = read_uint(); Blob *blob = new Blob(size); if (size) { - file->read(blob->buf, (unsigned)size); + file->read(blob->buf, size); } return blob; } @@ -763,7 +788,7 @@ const char * Parser::read_string(void) { size_t len = read_uint(); char * value = new char[len + 1]; if (len) { - file->read(value, (unsigned)len); + file->read(value, len); } value[len] = 0; #if TRACE_VERBOSE