PixelShaderCompiler.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include "PixelShaderCompiler.h"
  23. CPixelShaderCompiler::CPixelShaderCompiler(IDirect3DDevice9* pD3DDev, bool fStaySilent)
  24. : m_pD3DDev(pD3DDev)
  25. , m_hDll(NULL)
  26. , m_pD3DXCompileShader(NULL)
  27. , m_pD3DXDisassembleShader(NULL)
  28. {
  29. CString d3dx9_dll;
  30. d3dx9_dll.Format(_T("d3dx9_%d.dll"), D3DX_SDK_VERSION);
  31. m_hDll = LoadLibrary(d3dx9_dll);
  32. if(m_hDll)
  33. {
  34. m_pD3DXCompileShader = (D3DXCompileShaderPtr)GetProcAddress(m_hDll, "D3DXCompileShader");
  35. m_pD3DXDisassembleShader = (D3DXDisassembleShaderPtr)GetProcAddress(m_hDll, "D3DXDisassembleShader");
  36. }
  37. if(!fStaySilent)
  38. {
  39. if(!m_hDll)
  40. {
  41. AfxMessageBox(_T("Cannot load ") + d3dx9_dll + _T(", pixel shaders will not work."), MB_OK);
  42. }
  43. else if(!m_pD3DXCompileShader || !m_pD3DXDisassembleShader) 
  44. {
  45. AfxMessageBox(_T("Cannot find necessary function entry points in ") + d3dx9_dll + _T(", pixel shaders will not work."), MB_OK);
  46. }
  47. }
  48. }
  49. CPixelShaderCompiler::~CPixelShaderCompiler()
  50. {
  51. if(m_hDll) FreeLibrary(m_hDll);
  52. }
  53. HRESULT CPixelShaderCompiler::CompileShader(
  54.     LPCSTR pSrcData,
  55.     LPCSTR pFunctionName,
  56.     LPCSTR pProfile,
  57.     DWORD Flags,
  58.     IDirect3DPixelShader9** ppPixelShader,
  59. CString* disasm,
  60. CString* errmsg)
  61. {
  62. if(!m_pD3DXCompileShader || !m_pD3DXDisassembleShader)
  63. return E_FAIL;
  64. HRESULT hr;
  65. CComPtr<ID3DXBuffer> pShader, pDisAsm, pErrorMsgs;
  66. hr = m_pD3DXCompileShader(pSrcData, strlen(pSrcData), NULL, NULL, pFunctionName, pProfile, Flags, &pShader, &pErrorMsgs, NULL);
  67. if(FAILED(hr))
  68. {
  69. if(errmsg)
  70. {
  71. CStringA msg = "Unexpected compiler error";
  72. if(pErrorMsgs)
  73. {
  74. int len = pErrorMsgs->GetBufferSize();
  75. memcpy(msg.GetBufferSetLength(len), pErrorMsgs->GetBufferPointer(), len);
  76. }
  77. *errmsg = msg;
  78. }
  79. return hr;
  80. }
  81. if(ppPixelShader)
  82. {
  83. if(!m_pD3DDev) return E_FAIL;
  84. hr = m_pD3DDev->CreatePixelShader((DWORD*)pShader->GetBufferPointer(), ppPixelShader);
  85. if(FAILED(hr)) return hr;
  86. }
  87. if(disasm)
  88. {
  89. hr = m_pD3DXDisassembleShader((DWORD*)pShader->GetBufferPointer(), FALSE, NULL, &pDisAsm);
  90. if(SUCCEEDED(hr) && pDisAsm) *disasm = CStringA((const char*)pDisAsm->GetBufferPointer());
  91. }
  92. return S_OK;
  93. }