blob: 13987f4b0d9cb6de4509a5d13f039c7159f6bc93 [file] [log] [blame]
José Fonseca46a2db02011-04-28 08:48:20 +01001/**************************************************************************
2 *
3 * Copyright 2011 Jose Fonseca
4 * Copyright 2008-2009 VMware, Inc.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 *
25 **************************************************************************/
26
José Fonseca46a2db02011-04-28 08:48:20 +010027
28#include <stdio.h>
29
José Fonseca1e5d4212011-05-21 10:14:01 +010030#include "d3d9imports.hpp"
31#include "d3dshader.hpp"
José Fonseca46a2db02011-04-28 08:48:20 +010032
33
34typedef HRESULT
35(WINAPI *PD3DXDISASSEMBLESHADER)(
36 CONST DWORD *pShader,
37 BOOL EnableColorCode,
38 LPCSTR pComments,
39 LPD3DXBUFFER *ppDisassembly
40);
41
42
José Fonseca288a9bc2011-05-28 11:06:35 +010043void DumpShader(Trace::Writer &writer, const DWORD *tokens)
José Fonseca46a2db02011-04-28 08:48:20 +010044{
45 static BOOL firsttime = TRUE;
46 static HMODULE hD3DXModule = NULL;
47 static PD3DXDISASSEMBLESHADER pfnD3DXDisassembleShader = NULL;
48
49 if (firsttime) {
50 if (!hD3DXModule) {
51 unsigned release;
52 int version;
53 for (release = 0; release <= 1; ++release) {
54 /* Version 41 corresponds to Mar 2009 version of DirectX Runtime / SDK */
55 for (version = 41; version >= 0; --version) {
56 char filename[256];
57 _snprintf(filename, sizeof(filename),
58 "d3dx9%s%s%u.dll", release ? "" : "d", version ? "_" : "", version);
59 hD3DXModule = LoadLibraryA(filename);
60 if (hD3DXModule)
61 goto found;
62 }
63 }
64found:
65 ;
66 }
67
68 if (hD3DXModule) {
69 if (!pfnD3DXDisassembleShader) {
70 pfnD3DXDisassembleShader = (PD3DXDISASSEMBLESHADER)GetProcAddress(hD3DXModule, "D3DXDisassembleShader");
71 }
72 }
73
74 firsttime = FALSE;
75 }
76
77 if (pfnD3DXDisassembleShader) {
78 LPD3DXBUFFER pDisassembly = NULL;
79 HRESULT hr;
80
81 hr = pfnD3DXDisassembleShader( (DWORD *)tokens, FALSE, NULL, &pDisassembly);
82 if (hr == D3D_OK) {
José Fonseca288a9bc2011-05-28 11:06:35 +010083 writer.writeString((const char *)pDisassembly->GetBufferPointer());
José Fonseca46a2db02011-04-28 08:48:20 +010084 }
85
86 if (pDisassembly) {
87 pDisassembly->Release();
88 }
89
90 if (hr == D3D_OK) {
91 return;
92 }
93 }
94
José Fonseca288a9bc2011-05-28 11:06:35 +010095 writer.writeOpaque(tokens);
José Fonseca46a2db02011-04-28 08:48:20 +010096}