std::unique_ptr<DXShader> DXShader::CreateFromBinary(ShaderStage stage, const void* data, size_t length) { D3DBlob* bytecode = new D3DBlob(static_cast<unsigned int>(length), static_cast<const u8*>(data)); std::unique_ptr<DXShader> shader = CreateFromBlob(stage, bytecode); if (!shader) { bytecode->Release(); return nullptr; } return shader; }
std::unique_ptr<DXShader> DXShader::CreateFromSource(ShaderStage stage, const char* source, size_t length) { D3DBlob* bytecode; switch (stage) { case ShaderStage::Vertex: { if (!D3D::CompileVertexShader(std::string(source, length), &bytecode)) return nullptr; } break; case ShaderStage::Geometry: { if (!D3D::CompileGeometryShader(std::string(source, length), &bytecode)) return nullptr; } break; case ShaderStage::Pixel: { if (!D3D::CompilePixelShader(std::string(source, length), &bytecode)) return nullptr; } break; case ShaderStage::Compute: { if (!D3D::CompileComputeShader(std::string(source, length), &bytecode)) return nullptr; } default: return nullptr; } std::unique_ptr<DXShader> shader = CreateFromBlob(stage, bytecode); if (!shader) { bytecode->Release(); return nullptr; } return shader; }
std::shared_ptr<Shader> Shader::CreateFromMemory(RenderDevice* device, ShaderType type, const char* shaderText, const char* sourceFileName) { std::shared_ptr<Shader> shader; CComPtr<ID3DBlob> errorBlob; CComPtr<ID3DBlob> shaderBlob; if (SUCCEEDED(D3DCompile(shaderText, strlen(shaderText), sourceFileName != nullptr ? sourceFileName : "Talon Internal", nullptr, nullptr, D3D11::ToShaderEntryPoint(type), D3D11::ToShaderLevel(type), 0, 0, &shaderBlob, &errorBlob))) { std::string debugName = sourceFileName != nullptr ? sourceFileName : "Talon Internal"; shader = CreateFromBlob(device, type, shaderBlob, "Shader: " + debugName); } else { const char* errorText = (const char*)errorBlob->GetBufferPointer(); TalonLog(errorText); } return shader; }