Cycles: Linux Support for HIP-RT
This change switches Cycles to an opensource HIP-RT library which
implements hardware ray-tracing. This library is now used on
both Windows and Linux. While there should be no noticeable changes
on Windows, on Linux this adds support for hardware ray-tracing on
AMD GPUs.
The majority of the change is typical platform code to add new
library to the dependency builder, and a change in the way how
ahead-of-time (AoT) kernels are compiled. There are changes in
Cycles itself, but they are rather straightforward: some APIs
changed in the opensource version of the library.
There are a couple of extra files which are needed for this to
work: hiprt02003_6.1_amd.hipfb and oro_compiled_kernels.hipfb.
There are some assumptions in the HIP-RT library about how they
are available. Currently they follow the same rule as AoT
kernels for oneAPI:
- On Windows they are next to blender.exe
- On Linux they are in the lib/ folder
Performance comparison on Ubuntu 22.04.5:
```
GPU: AMD Radeon PRO W7800
Driver: amdgpu-install_6.1.60103-1_all.deb
main hip-rt
attic 0.1414s 0.0932s
barbershop_interior 0.1563s 0.1258s
bistro 0.2134s 0.1597s
bmw27 0.0119s 0.0099s
classroom 0.1006s 0.0803s
fishy_cat 0.0248s 0.0178s
junkshop 0.0916s 0.0713s
koro 0.0589s 0.0720s
monster 0.0435s 0.0385s
pabellon 0.0543s 0.0391s
sponza 0.0223s 0.0180s
spring 0.1026s 1.5145s
victor 0.1901s 0.1239s
wdas_cloud 0.1153s 0.1125s
```
Co-authored-by: Brecht Van Lommel <brecht@blender.org>
Co-authored-by: Ray Molenkamp <github@lazydodo.com>
Co-authored-by: Sergey Sharybin <sergey@blender.org>
Pull Request: https://projects.blender.org/blender/blender/pulls/121050
This commit is contained in:
committed by
Sergey Sharybin
parent
dfa25d3f05
commit
26ed4d3892
112
extern/hipew/include/hiprtew.h
vendored
112
extern/hipew/include/hiprtew.h
vendored
@@ -20,63 +20,141 @@
|
||||
#include <hiprt/hiprt_types.h>
|
||||
|
||||
#define HIPRT_MAJOR_VERSION 2
|
||||
#define HIPRT_MINOR_VERSION 0
|
||||
#define HIPRT_PATCH_VERSION 0xb68861
|
||||
#define HIPRT_MINOR_VERSION 3
|
||||
#define HIPRT_PATCH_VERSION 0x7df94af
|
||||
|
||||
#define HIPRT_API_VERSION 2000
|
||||
#define HIPRT_VERSION_STR "02000"
|
||||
#define HIPRT_API_VERSION 2003
|
||||
#define HIPRT_VERSION_STR "02003"
|
||||
#define HIP_VERSION_STR "6.0"
|
||||
|
||||
#ifdef _WIN32
|
||||
#define HIPRTAPI __stdcall
|
||||
#else
|
||||
#define HIPRTAPI
|
||||
#define HIP_CB
|
||||
#endif
|
||||
|
||||
typedef unsigned int hiprtuint32_t;
|
||||
|
||||
/* Function types. */
|
||||
typedef hiprtError(thiprtCreateContext)(hiprtuint32_t hiprtApiVersion,
|
||||
hiprtContextCreationInput &input,
|
||||
const hiprtContextCreationInput &input,
|
||||
hiprtContext *outContext);
|
||||
typedef hiprtError(thiprtDestroyContext)(hiprtContext context);
|
||||
typedef hiprtError(thiprtCreateGeometry)(hiprtContext context,
|
||||
const hiprtGeometryBuildInput *buildInput,
|
||||
const hiprtBuildOptions *buildOptions,
|
||||
hiprtGeometry *outGeometry);
|
||||
const hiprtGeometryBuildInput &buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
hiprtGeometry &outGeometry);
|
||||
typedef hiprtError(thiprtDestroyGeometry)(hiprtContext context,
|
||||
hiprtGeometry outGeometry);
|
||||
typedef hiprtError(thiprtCreateGeometries)(hiprtContext context,
|
||||
uint32_t numGeometries,
|
||||
const hiprtGeometryBuildInput *buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
hiprtGeometry **outGeometries);
|
||||
typedef hiprtError(thiprtDestroyGeometries)(hiprtContext context, uint32_t numGeometries,
|
||||
hiprtGeometry* outGeometry);
|
||||
|
||||
typedef hiprtError(thiprtBuildGeometry)(hiprtContext context,
|
||||
hiprtBuildOperation buildOperation,
|
||||
const hiprtGeometryBuildInput &buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
hiprtDevicePtr temporaryBuffer,
|
||||
hiprtApiStream stream,
|
||||
hiprtGeometry outGeometry);
|
||||
|
||||
typedef hiprtError(thiprtBuildGeometries)(hiprtContext context,
|
||||
uint32_t numGeometries,
|
||||
hiprtBuildOperation buildOperation,
|
||||
const hiprtGeometryBuildInput *buildInput,
|
||||
const hiprtBuildOptions *buildOptions,
|
||||
hiprtDevicePtr temporaryBuffer,
|
||||
hiprtApiStream stream,
|
||||
hiprtGeometry outGeometry);
|
||||
hiprtGeometry *outGeometries);
|
||||
|
||||
|
||||
typedef hiprtError(thiprtGetGeometryBuildTemporaryBufferSize)(
|
||||
hiprtContext context,
|
||||
const hiprtGeometryBuildInput &buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
size_t &outSize);
|
||||
|
||||
typedef hiprtError(thiprtGetGeometriesBuildTemporaryBufferSize)(
|
||||
hiprtContext context,
|
||||
uint32_t numGeometries,
|
||||
const hiprtGeometryBuildInput *buildInput,
|
||||
const hiprtBuildOptions *buildOptions,
|
||||
size_t *outSize);
|
||||
size_t &outSize);
|
||||
|
||||
typedef hiprtError(thiprtCompactGeometry)( hiprtContext context, hiprtApiStream stream, hiprtGeometry geometryIn, hiprtGeometry& geometryOut);
|
||||
|
||||
typedef hiprtError(thiprtCompactGeometries)(
|
||||
hiprtContext context,
|
||||
uint32_t numGeometries,
|
||||
hiprtApiStream stream,
|
||||
hiprtGeometry* geometriesIn,
|
||||
hiprtGeometry** geometriesOut );
|
||||
|
||||
typedef hiprtError(thiprtCreateScene)(hiprtContext context,
|
||||
const hiprtSceneBuildInput &buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
hiprtScene &outScene);
|
||||
|
||||
typedef hiprtError(thiprtCreateScenes)(hiprtContext context,
|
||||
uint32_t numScenes,
|
||||
const hiprtSceneBuildInput *buildInput,
|
||||
const hiprtBuildOptions *buildOptions,
|
||||
hiprtScene *outScene);
|
||||
const hiprtBuildOptions buildOptions,
|
||||
hiprtScene **outScene);
|
||||
|
||||
typedef hiprtError(thiprtDestroyScene)(hiprtContext context, hiprtScene outScene);
|
||||
typedef hiprtError(thiprtDestroyScenes)( hiprtContext context, uint32_t numScenes,hiprtScene *scene );
|
||||
typedef hiprtError(thiprtBuildScene)(hiprtContext context,
|
||||
hiprtBuildOperation buildOperation,
|
||||
const hiprtSceneBuildInput &buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
hiprtDevicePtr temporaryBuffer,
|
||||
hiprtApiStream stream,
|
||||
hiprtScene outScene);
|
||||
typedef hiprtError(thiprtBuildScenes)(hiprtContext context,
|
||||
uint32_t numScenes,
|
||||
hiprtBuildOperation buildOperation,
|
||||
const hiprtSceneBuildInput *buildInput,
|
||||
const hiprtBuildOptions *buildOptions,
|
||||
hiprtDevicePtr temporaryBuffer,
|
||||
hiprtApiStream stream,
|
||||
hiprtScene outScene);
|
||||
hiprtScene *outScene);
|
||||
typedef hiprtError(thiprtGetSceneBuildTemporaryBufferSize)(
|
||||
hiprtContext context,
|
||||
const hiprtSceneBuildInput &buildInput,
|
||||
const hiprtBuildOptions buildOptions,
|
||||
size_t &outSize);
|
||||
|
||||
typedef hiprtError(thiprtGetScenesBuildTemporaryBufferSize)(
|
||||
hiprtContext context,
|
||||
uint32_t numScenes,
|
||||
const hiprtSceneBuildInput *buildInput,
|
||||
const hiprtBuildOptions *buildOptions,
|
||||
size_t *outSize);
|
||||
const hiprtBuildOptions buildOptions,
|
||||
size_t &outSize);
|
||||
|
||||
typedef hiprtError(thiprtCompactScene)( hiprtContext context, hiprtApiStream stream, hiprtScene sceneIn, hiprtScene& sceneOut );
|
||||
|
||||
typedef hiprtError(thiprtCompactScenes)(
|
||||
hiprtContext context, uint32_t numScenes, hiprtApiStream stream, hiprtScene* scenesIn, hiprtScene** scenesOut );
|
||||
|
||||
typedef hiprtError(thiprtCreateFuncTable)(hiprtContext context,
|
||||
hiprtuint32_t numGeomTypes,
|
||||
hiprtuint32_t numRayTypes,
|
||||
hiprtFuncTable *outFuncTable);
|
||||
hiprtFuncTable &outFuncTable);
|
||||
typedef hiprtError(thiprtSetFuncTable)(hiprtContext context,
|
||||
hiprtFuncTable funcTable,
|
||||
hiprtuint32_t geomType,
|
||||
hiprtuint32_t rayType,
|
||||
hiprtFuncDataSet set);
|
||||
|
||||
|
||||
typedef hiprtError (thiprtCreateGlobalStackBuffer)(hiprtContext context, const hiprtGlobalStackBufferInput& input, hiprtGlobalStackBuffer& stackBufferOut );
|
||||
typedef hiprtError (thiprtDestroyGlobalStackBuffer)( hiprtContext context, hiprtGlobalStackBuffer stackBuffer );
|
||||
|
||||
typedef hiprtError(thiprtDestroyFuncTable)(hiprtContext context,
|
||||
hiprtFuncTable funcTable);
|
||||
typedef void(thiprtSetLogLevel)( hiprtLogLevel level );
|
||||
@@ -94,6 +172,8 @@ extern thiprtBuildScene *hiprtBuildScene;
|
||||
extern thiprtGetSceneBuildTemporaryBufferSize *hiprtGetSceneBuildTemporaryBufferSize;
|
||||
extern thiprtCreateFuncTable *hiprtCreateFuncTable;
|
||||
extern thiprtSetFuncTable *hiprtSetFuncTable;
|
||||
extern thiprtCreateGlobalStackBuffer *hiprtCreateGlobalStackBuffer;
|
||||
extern thiprtDestroyGlobalStackBuffer *hiprtDestroyGlobalStackBuffer;
|
||||
extern thiprtDestroyFuncTable *hiprtDestroyFuncTable;
|
||||
extern thiprtSetLogLevel *hiprtSetLogLevel;
|
||||
|
||||
|
||||
1
extern/hipew/src/hipew.c
vendored
1
extern/hipew/src/hipew.c
vendored
@@ -234,7 +234,6 @@ static int hipewHipInit(void) {
|
||||
#ifdef _WIN32
|
||||
/* Expected in C:/Windows/System32 or similar, no path needed. */
|
||||
const char *hip_paths[] = {"amdhip64.dll", "amdhip64_6.dll", NULL};
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
/* Default installation path. */
|
||||
const char *hip_paths[] = {"", NULL};
|
||||
|
||||
13
extern/hipew/src/hiprtew.cc
vendored
13
extern/hipew/src/hiprtew.cc
vendored
@@ -40,6 +40,8 @@ thiprtBuildScene *hiprtBuildScene;
|
||||
thiprtGetSceneBuildTemporaryBufferSize *hiprtGetSceneBuildTemporaryBufferSize;
|
||||
thiprtCreateFuncTable *hiprtCreateFuncTable;
|
||||
thiprtSetFuncTable *hiprtSetFuncTable;
|
||||
thiprtCreateGlobalStackBuffer *hiprtCreateGlobalStackBuffer;
|
||||
thiprtDestroyGlobalStackBuffer *hiprtDestroyGlobalStackBuffer;
|
||||
thiprtDestroyFuncTable *hiprtDestroyFuncTable;
|
||||
thiprtSetLogLevel *hiprtSetLogLevel;
|
||||
|
||||
@@ -61,15 +63,17 @@ bool hiprtewInit()
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
initialized = true;
|
||||
|
||||
if (atexit(hipewHipRtExit)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string hiprt_ver(HIPRT_VERSION_STR);
|
||||
std::string hiprt_path = "hiprt" + hiprt_ver + "64.dll";
|
||||
#ifdef _WIN32
|
||||
std::string hiprt_path = "hiprt64.dll";
|
||||
#else
|
||||
std::string hiprt_path = "libhiprt64.so";
|
||||
#endif
|
||||
|
||||
hiprt_lib = dynamic_library_open(hiprt_path.c_str());
|
||||
|
||||
@@ -89,11 +93,12 @@ bool hiprtewInit()
|
||||
HIPRT_LIBRARY_FIND(hiprtGetSceneBuildTemporaryBufferSize)
|
||||
HIPRT_LIBRARY_FIND(hiprtCreateFuncTable)
|
||||
HIPRT_LIBRARY_FIND(hiprtSetFuncTable)
|
||||
HIPRT_LIBRARY_FIND(hiprtCreateGlobalStackBuffer)
|
||||
HIPRT_LIBRARY_FIND(hiprtDestroyFuncTable)
|
||||
HIPRT_LIBRARY_FIND(hiprtDestroyGlobalStackBuffer)
|
||||
HIPRT_LIBRARY_FIND(hiprtSetLogLevel)
|
||||
|
||||
result = true;
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user