Esempio n. 1
0
// code->bytecode
bool CompileGeometryShader(const std::string& code, D3DBlob** blob,
                           const D3D_SHADER_MACRO* pDefines)
{
    ID3D10Blob* shaderBuffer = nullptr;
    ID3D10Blob* errorBuffer = nullptr;

#if defined(_DEBUG) || defined(DEBUGFAST)
    UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY | D3D10_SHADER_DEBUG;
#else
    UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY | D3D10_SHADER_OPTIMIZATION_LEVEL3 |
                 D3D10_SHADER_SKIP_VALIDATION;
#endif
    HRESULT hr =
        PD3DCompile(code.c_str(), code.length(), nullptr, pDefines, nullptr, "main",
                    D3D::GeometryShaderVersionString(), flags, 0, &shaderBuffer, &errorBuffer);

    if (errorBuffer)
    {
        INFO_LOG(VIDEO, "Geometry shader compiler messages:\n%s\n",
                 (const char*)errorBuffer->GetBufferPointer());
    }

    if (FAILED(hr))
    {
        static int num_failures = 0;
        std::string filename = StringFromFormat("%sbad_gs_%04i.txt",
                                                File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++);
        std::ofstream file;
        OpenFStream(file, filename, std::ios_base::out);
        file << code;
        file.close();

        PanicAlert("Failed to compile geometry shader: %s\nDebug info (%s):\n%s", filename.c_str(),
                   D3D::GeometryShaderVersionString(), (const char*)errorBuffer->GetBufferPointer());

        *blob = nullptr;
        errorBuffer->Release();
    }
    else
    {
        *blob = new D3DBlob(shaderBuffer);
        shaderBuffer->Release();
    }
    return SUCCEEDED(hr);
}
Esempio n. 2
0
HRESULT HLSLCompiler::CompileShader(LPCVOID pSrcData,
	SIZE_T SrcDataSize,
	LPCSTR pSourceName,
	const D3D_SHADER_MACRO *pDefines,
	ID3DInclude *pInclude,
	LPCSTR pEntrypoint,
	LPCSTR pTarget,
	UINT Flags1,
	UINT Flags2,
	ID3DBlob **ppCode,
	ID3DBlob **ppErrorMsgs)
{
	return PD3DCompile(pSrcData,
		SrcDataSize,
		pSourceName,
		pDefines,
		pInclude,
		pEntrypoint,
		pTarget,
		Flags1, Flags2,
		ppCode,
		ppErrorMsgs);
}
Esempio n. 3
0
bool HLSLAsyncCompiler::NextTask()
{
	ShaderCompilerWorkUnit* unit;
	if (m_input.try_pop(unit))
	{
		if (unit->GenerateCodeHandler)
		{
			unit->GenerateCodeHandler(unit);
		}
		unit->cresult = PD3DCompile(unit->code.data(),
			unit->codesize,
			nullptr,
			(const D3D_SHADER_MACRO*)unit->defines,
			nullptr,
			unit->entrypoint,
			unit->target,
			unit->flags, 0,
			&unit->shaderbytecode,
			&unit->error);
		m_output.push(unit);
		return true;
	}
	return false;
}