ID3DBlob *ShaderLanguageHlsl::loadShader(const char *shaderModel, const char *shaderSource, const char *entryPoint) const { // Get compile flags UINT compileFlags = D3DCOMPILE_ENABLE_STRICTNESS; switch (getOptimizationLevel()) { case OptimizationLevel::Debug: compileFlags |= D3DCOMPILE_DEBUG; compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; break; case OptimizationLevel::None: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; break; case OptimizationLevel::Low: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL0; break; case OptimizationLevel::Medium: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL1; break; case OptimizationLevel::High: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL2; break; case OptimizationLevel::Ultra: compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL3; break; } ID3DBlob *d3dBlob = nullptr; ID3DBlob *errorBlob = nullptr; if (FAILED(D3DX10CompileFromMemory(shaderSource, strlen(shaderSource), nullptr, nullptr, nullptr, entryPoint ? entryPoint : "main", shaderModel, compileFlags, 0, nullptr, &d3dBlob, &errorBlob, nullptr))) { if (nullptr != errorBlob) { ::OutputDebugStringA(static_cast<char*>(errorBlob->GetBufferPointer())); errorBlob->Release(); } // Error! return nullptr; } if (nullptr != errorBlob) { errorBlob->Release(); } // Done return d3dBlob; }
ID3DBlob *ShaderLanguageHlsl::loadShader(const char *shaderModel, const char *shaderSource, const char *entryPoint) const { assert(nullptr != shaderModel); assert(nullptr != shaderSource); // TODO(co) Cleanup ID3DBlob *d3dBlob; HRESULT hr = S_OK; // Get compile flags UINT compileFlags = D3DCOMPILE_ENABLE_STRICTNESS; switch (getOptimizationLevel()) { case OptimizationLevel::Debug: compileFlags |= D3DCOMPILE_DEBUG; compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; break; case OptimizationLevel::None: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; break; case OptimizationLevel::Low: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL0; break; case OptimizationLevel::Medium: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL1; break; case OptimizationLevel::High: compileFlags |= D3DCOMPILE_SKIP_VALIDATION; compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL2; break; case OptimizationLevel::Ultra: compileFlags |= D3DCOMPILE_OPTIMIZATION_LEVEL3; break; } // TODO(co) Direct3D 12 version? ID3DBlob *errorBlob; hr = D3DX11CompileFromMemory(shaderSource, strlen(shaderSource), nullptr, nullptr, nullptr, entryPoint ? entryPoint : "main", shaderModel, compileFlags, 0, nullptr, &d3dBlob, &errorBlob, nullptr ); if (FAILED(hr)) { if( errorBlob != nullptr ) OutputDebugStringA( (char*)errorBlob->GetBufferPointer() ); if( errorBlob ) errorBlob->Release(); return nullptr; } if (nullptr != errorBlob ) errorBlob->Release(); // Done return d3dBlob; }