Shader *D3D10PixelShader::CreatePixelShaderFromBlob(ShaderBlob const &blob, CTSTR lpShader, CTSTR lpFileName) { ShaderProcessor shaderProcessor; if (!shaderProcessor.ProcessShader(lpShader, lpFileName)) AppWarning(TEXT("Unable to process pixel shader '%s'"), lpFileName); //don't exit, leave it to the actual shader compiler to tell the errors //----------------------------------------------- if (!blob.size()) return nullptr; ID3D11PixelShader *pShader; HRESULT err = GetD3D()->CreatePixelShader(&blob.front(), blob.size(), NULL, &pShader); if (FAILED(err)) { CrashError(TEXT("Unable to create pixel shader '%s', result = %08lX"), lpFileName, err); return NULL; } //----------------------------------------------- D3D10PixelShader *shader = new D3D10PixelShader; shader->pixelShader = pShader; if (!shader->ProcessData(shaderProcessor, lpFileName)) { delete shader; return NULL; } return shader; }
Shader* D3D10PixelShader::CreatePixelShader(CTSTR lpShader, CTSTR lpFileName) { String errorString; ShaderProcessor shaderProcessor; if(!shaderProcessor.ProcessShader(lpShader, lpFileName)) AppWarning(TEXT("Unable to process pixel shader '%s'"), lpFileName); //don't exit, leave it to the actual shader compiler to tell the errors //----------------------------------------------- LPSTR lpAnsiShader = tstr_createUTF8(lpShader); LPSTR lpAnsiFileName = tstr_createUTF8(lpFileName); D3D10System *d3d10Sys = static_cast<D3D10System*>(GS); LPCSTR lpPSType = d3d10Sys->bDisableCompatibilityMode ? "ps_4_0" : "ps_4_0_level_9_3"; ID3D10Blob *errorMessages = NULL, *shaderBlob = NULL; HRESULT err = D3DX10CompileFromMemory(lpAnsiShader, strlen(lpAnsiShader), lpAnsiFileName, NULL, NULL, "main", lpPSType, D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, NULL, &shaderBlob, &errorMessages, NULL); Free(lpAnsiFileName); Free(lpAnsiShader); if(FAILED(err)) { if(errorMessages) { if(errorMessages->GetBufferSize()) { LPSTR lpErrors = (LPSTR)errorMessages->GetBufferPointer(); Log(TEXT("Error compiling pixel shader '%s':\r\n\r\n%S\r\n"), lpFileName, lpErrors); } errorMessages->Release(); } CrashError(TEXT("Compilation of pixel shader '%s' failed, result = %08lX"), lpFileName, err); return NULL; } //----------------------------------------------- ID3D10PixelShader *pShader; err = GetD3D()->CreatePixelShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), &pShader); if(FAILED(err)) { CrashError(TEXT("Unable to create pixel shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); return NULL; } shaderBlob->Release(); //----------------------------------------------- D3D10PixelShader *shader = new D3D10PixelShader; shader->pixelShader = pShader; if(!shader->ProcessData(shaderProcessor, lpFileName)) { delete shader; return NULL; } return shader; }
Shader* D3D10PixelShader::CreatePixelShader(CTSTR lpShader, CTSTR lpFileName) { String errorString; ShaderProcessor shaderProcessor; if(!shaderProcessor.ProcessShader(lpShader, lpFileName)) AppWarning(TEXT("Unable to process pixel shader '%s'"), lpFileName); //don't exit, leave it to the actual shader compiler to tell the errors //----------------------------------------------- D3D10System *d3d10Sys = static_cast<D3D10System*>(GS); LPCSTR lpPSType = d3d10Sys->bDisableCompatibilityMode ? "ps_4_0" : "ps_4_0_level_9_3"; String cacheFilename = FormattedString(TEXT("%s/shaderCache/%s.blob"), OBSGetAppDataPath(), lpFileName).FindReplace(TEXT("\\"), TEXT("/")); Log(cacheFilename); List<BYTE> shaderBuffer; LPVOID shaderData; SIZE_T shaderDataSize; ID3D10Blob *errorMessages = NULL, *shaderBlob = NULL; HRESULT err; if(!OSFileExists(cacheFilename) || OSGetFileModificationTime(lpFileName) > OSGetFileModificationTime(cacheFilename)) { LPSTR lpAnsiShader = tstr_createUTF8(lpShader); LPSTR lpAnsiFileName = tstr_createUTF8(lpFileName); err = D3DX10CompileFromMemory(lpAnsiShader, strlen(lpAnsiShader), lpAnsiFileName, NULL, NULL, "main", lpPSType, D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, NULL, &shaderBlob, &errorMessages, NULL); Free(lpAnsiFileName); Free(lpAnsiShader); if(FAILED(err)) { if(errorMessages) { if(errorMessages->GetBufferSize()) { LPSTR lpErrors = (LPSTR)errorMessages->GetBufferPointer(); Log(TEXT("Error compiling pixel shader '%s':\r\n\r\n%S\r\n"), lpFileName, lpErrors); } errorMessages->Release(); } CrashError(TEXT("Compilation of pixel shader '%s' failed, result = %08lX"), lpFileName, err); return NULL; } shaderData = shaderBlob->GetBufferPointer(); shaderDataSize = shaderBlob->GetBufferSize(); CreatePath(GetPathDirectory(cacheFilename)); XFile cacheFile(cacheFilename, XFILE_WRITE, XFILE_CREATEALWAYS); cacheFile.Write(shaderData, (DWORD)shaderDataSize); } else { XFile cacheFile(cacheFilename, XFILE_READ | XFILE_SHARED, XFILE_OPENEXISTING); shaderBuffer.SetSize((unsigned)cacheFile.GetFileSize()); cacheFile.Read(shaderBuffer.Array(), shaderBuffer.Num()); shaderData = shaderBuffer.Array(); shaderDataSize = shaderBuffer.Num(); } //----------------------------------------------- ID3D10PixelShader *pShader; err = GetD3D()->CreatePixelShader(shaderData, shaderDataSize, &pShader); if(FAILED(err)) { CrashError(TEXT("Unable to create pixel shader '%s', result = %08lX"), lpFileName, err); SafeRelease(shaderBlob); return NULL; } SafeRelease(shaderBlob); //----------------------------------------------- D3D10PixelShader *shader = new D3D10PixelShader; shader->pixelShader = pShader; if(!shader->ProcessData(shaderProcessor, lpFileName)) { delete shader; return NULL; } return shader; }