static void writeValue(trace::Writer &writer, const QVariant &var, unsigned &id) { int arrayType = QMetaType::type("ApiArray"); int bitmaskType = QMetaType::type("ApiBitmask"); int structType = QMetaType::type("ApiStruct"); int pointerType = QMetaType::type("ApiPointer"); int enumType = QMetaType::type("ApiEnum"); int type = var.userType(); switch(type) { case QVariant::Bool: writer.writeBool(var.toBool()); break; case QVariant::ByteArray: { QByteArray ba = var.toByteArray(); writer.writeBlob((const void*)ba.constData(), ba.size()); } break; case QVariant::Double: writer.writeDouble(var.toDouble()); break; case QMetaType::Float: writer.writeFloat(var.toFloat()); break; case QVariant::Int: writer.writeSInt(var.toInt()); break; case QVariant::LongLong: writer.writeSInt(var.toLongLong()); break; case QVariant::String: { QString str = var.toString(); writer.writeString(str.toLocal8Bit().constData(), str.length()); } break; case QVariant::UInt: writer.writeUInt(var.toInt()); break; case QVariant::ULongLong: writer.writeUInt(var.toLongLong()); break; default: if (type == arrayType) { ApiArray array = var.value<ApiArray>(); QVector<QVariant> vals = array.values(); writer.beginArray(vals.count()); foreach(QVariant el, vals) { writer.beginElement(); writeValue(writer, el, ++id); writer.endElement(); } writer.endArray(); } else if (type == bitmaskType) {
void DumpShader(trace::Writer &writer, const DWORD *tokens) { IDisassemblyBuffer *pDisassembly = NULL; HRESULT hr = DisassembleShader(tokens, &pDisassembly); if (SUCCEEDED(hr)) { writer.beginRepr(); writer.writeString((const char *)pDisassembly->GetBufferPointer(), pDisassembly->GetBufferSize()); pDisassembly->Release(); } writer.writeBlob(tokens, _shaderSize(tokens)); if (SUCCEEDED(hr)) { writer.endRepr(); } }
void DumpShader(trace::Writer &writer, const DWORD *tokens) { static BOOL firsttime = TRUE; /* * TODO: Consider using d3dcompile_xx.dll per * http://msdn.microsoft.com/en-us/library/windows/desktop/ee663275.aspx */ static HMODULE hD3DXModule = NULL; static PD3DXDISASSEMBLESHADER pfnD3DXDisassembleShader = NULL; if (firsttime) { if (!hD3DXModule) { unsigned release; int version; for (release = 0; release <= 1; ++release) { /* Version 41 corresponds to Mar 2009 version of DirectX Runtime / SDK */ for (version = 41; version >= 0; --version) { char filename[256]; _snprintf(filename, sizeof(filename), "d3dx9%s%s%u.dll", release ? "" : "d", version ? "_" : "", version); hD3DXModule = LoadLibraryA(filename); if (hD3DXModule) goto found; } } found: ; } if (hD3DXModule) { if (!pfnD3DXDisassembleShader) { pfnD3DXDisassembleShader = (PD3DXDISASSEMBLESHADER)GetProcAddress(hD3DXModule, "D3DXDisassembleShader"); } } firsttime = FALSE; } LPD3DXBUFFER pDisassembly = NULL; HRESULT hr = E_FAIL; if (pfnD3DXDisassembleShader) { hr = pfnD3DXDisassembleShader(tokens, FALSE, NULL, &pDisassembly); } if (SUCCEEDED(hr)) { writer.beginRepr(); writer.writeString((const char *)pDisassembly->GetBufferPointer(), pDisassembly->GetBufferSize()); } writer.writeBlob(tokens, _shaderSize(tokens)); if (pDisassembly) { pDisassembly->Release(); } if (SUCCEEDED(hr)) { writer.endRepr(); } }