PixelShaderCompiler.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 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. else if(!fStaySilent)
  38. {
  39. AfxMessageBox(_T("Cannot load ") + d3dx9_dll + _T(", pixel shaders will not work."), MB_OK);
  40. }
  41. }
  42. CPixelShaderCompiler::~CPixelShaderCompiler()
  43. {
  44. if(m_hDll) FreeLibrary(m_hDll);
  45. }
  46. HRESULT CPixelShaderCompiler::CompileShader(
  47.     LPCSTR pSrcData,
  48.     LPCSTR pFunctionName,
  49.     LPCSTR pProfile,
  50.     DWORD Flags,
  51.     IDirect3DPixelShader9** ppPixelShader,
  52. CString* disasm,
  53. CString* errmsg)
  54. {
  55. if(!m_pD3DXCompileShader || !m_pD3DXDisassembleShader) 
  56. return E_FAIL;
  57. HRESULT hr;
  58. CComPtr<ID3DXBuffer> pShader, pDisAsm, pErrorMsgs;
  59. hr = m_pD3DXCompileShader(pSrcData, strlen(pSrcData), NULL, NULL, pFunctionName, pProfile, Flags, &pShader, &pErrorMsgs, NULL);
  60. if(FAILED(hr))
  61. {
  62. if(errmsg)
  63. {
  64. CStringA msg = "Unexpected compiler error";
  65. if(pErrorMsgs)
  66. {
  67. int len = pErrorMsgs->GetBufferSize();
  68. memcpy(msg.GetBufferSetLength(len), pErrorMsgs->GetBufferPointer(), len);
  69. }
  70. *errmsg = msg;
  71. }
  72. return hr;
  73. }
  74. if(ppPixelShader)
  75. {
  76. if(!m_pD3DDev) return E_FAIL;
  77. hr = m_pD3DDev->CreatePixelShader((DWORD*)pShader->GetBufferPointer(), ppPixelShader);
  78. if(FAILED(hr)) return hr;
  79. }
  80. if(disasm)
  81. {
  82. hr = m_pD3DXDisassembleShader((DWORD*)pShader->GetBufferPointer(), FALSE, NULL, &pDisAsm);
  83. if(SUCCEEDED(hr) && pDisAsm) *disasm = CStringA((const char*)pDisAsm->GetBufferPointer());
  84. }
  85. return S_OK;
  86. }