Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linking dynamic pipeline shader libraries on Linux doesn't work as-is #27

Open
expenses opened this issue May 6, 2023 · 4 comments
Open

Comments

@expenses
Copy link

expenses commented May 6, 2023

I had to make the below changes to rps_rpsl_host_dll.c to get dynamic libraries to work on Linux. Not sure how portable these changes are back to windows but I'm sure it's possible to work out something more platform-independent.

diff --git a/src/runtime/common/rps_rpsl_host_dll.c b/src/runtime/common/rps_rpsl_host_dll.c
index 50a79e4..d408677 100644
--- a/src/runtime/common/rps_rpsl_host_dll.c
+++ b/src/runtime/common/rps_rpsl_host_dll.c
@@ -98,9 +98,9 @@ void ___rpsl_abort(uint32_t result)
 }
 
 uint32_t ___rpsl_node_call(
-    uint32_t nodeDeclId, uint32_t numArgs, void** ppArgs, uint32_t nodeCallFlags, uint32_t nodeId)
+    uint32_t nodeDeclId, uint32_t numArgs, uint8_t** ppArgs, uint32_t nodeCallFlags, uint32_t nodeId)
 {
-    return (*s_rpslRuntimeProcs.pfn_rpsl_node_call)(nodeDeclId, numArgs, ppArgs, nodeCallFlags, nodeId);
+    return (*s_rpslRuntimeProcs.pfn_rpsl_node_call)(nodeDeclId, numArgs, (void**)ppArgs, nodeCallFlags, nodeId);
 }
 
 void ___rpsl_node_dependencies(uint32_t numDeps, const uint32_t* pDeps, uint32_t dstNodeId)
@@ -124,9 +124,9 @@ void ___rpsl_scheduler_marker(uint32_t opCode, uint32_t flags, const char* name,
     (*s_rpslRuntimeProcs.pfn_rpsl_scheduler_marker)(opCode, flags, name, nameLength);
 }
 
-void ___rpsl_describe_handle(void* pOutData, uint32_t dataSize, uint32_t* inHandle, uint32_t describeOp)
+void ___rpsl_describe_handle(uint8_t* pOutData, uint32_t dataSize, uint32_t* inHandle, uint32_t describeOp)
 {
-    (*s_rpslRuntimeProcs.pfn_rpsl_describe_handle)( pOutData, dataSize, inHandle, describeOp);
+    (*s_rpslRuntimeProcs.pfn_rpsl_describe_handle)( (void*)pOutData, dataSize, inHandle, describeOp);
 }
 
 uint32_t ___rpsl_create_resource(uint32_t type,
@@ -145,7 +145,7 @@ uint32_t ___rpsl_create_resource(uint32_t type,
         type, flags, format, width, height, depthOrArraySize, mipLevels, sampleCount, sampleQuality, temporalLayers, id);
 }
 
-void ___rpsl_name_resource(uint32_t resourceHdl, const char* name, uint32_t nameLength)
+void ___rpsl_name_resource(uint32_t resourceHdl, unsigned char* name, uint32_t nameLength)
 {
     (*s_rpslRuntimeProcs.pfn_rpsl_name_resource)(resourceHdl, name, nameLength);
 }
@@ -190,7 +190,7 @@ uint8_t ___rpsl_dxop_isSpecialFloat_f32(uint32_t op, float a)
     return (*s_rpslRuntimeProcs.pfn_rpsl_dxop_isSpecialFloat_f32)(op, a);
 }
 
-int __declspec(dllexport) ___rps_dyn_lib_init(const ___rpsl_runtime_procs* pProcs, uint32_t sizeofProcs)
+int ___rps_dyn_lib_init(const ___rpsl_runtime_procs* pProcs, uint32_t sizeofProcs)
 {
     if (sizeof(___rpsl_runtime_procs) != sizeofProcs)
     {
@FlorianHerickAMD
Copy link
Collaborator

Thank you for reporting this. We will address this either as part of a small maintenance update or the next version.

@FlorianHerickAMD
Copy link
Collaborator

Finding a platform-independent solution for the export declaration is definitely possible but your other changes leave me a little curious.

I do not see an obvious requirement for the usage of uint8_t pointers instead of void pointers and unsigned char strings instead of const char ones that is linux specific. Would you mind elaborating on these changes?

@expenses
Copy link
Author

@FlorianHerickAMD

Without that I get these errors:

3d.rpsl.g.c:588:10: error: conflicting types for ‘___rpsl_node_call’; have ‘uint32_t(uint32_t,  uint32_t,  uint8_t **, uint32_t,  uint32_t)’ {aka ‘unsigned int(unsigned int,  unsigned int,  unsigned char **, unsigned int,  unsigned int)’}
  588 | uint32_t ___rpsl_node_call(uint32_t, uint32_t, uint8_t**, uint32_t, uint32_t);
      |          ^~~~~~~~~~~~~~~~~
In file included from <command-line>:
./RenderPipelineShaders/src/runtime/common/rps_rpsl_host_dll.c:100:10: note: previous definition of ‘___rpsl_node_call’ with type ‘uint32_t(uint32_t,  uint32_t,  void **, uint32_t,  uint32_t)’ {aka ‘unsigned int(unsigned int,  unsigned int,  void **, unsigned int,  unsigned int)’}
  100 | uint32_t ___rpsl_node_call(
      |          ^~~~~~~~~~~~~~~~~
3d.rpsl.g.c:590:6: error: conflicting types for ‘___rpsl_describe_handle’; have ‘void(uint8_t *, uint32_t,  uint32_t *, uint32_t)’ {aka ‘void(unsigned char *, unsigned int,  unsigned int *, unsigned int)’}
  590 | void ___rpsl_describe_handle(uint8_t*, uint32_t, uint32_t*, uint32_t);

The output C file from rps-hlslc contains different functions declarations from what's in RenderPipelineShaders/src/runtime/common/rps_rpsl_host_dll.c:

/* Function Declarations */
static struct texture _BA__PD_make_default_texture_view_from_desc_AE__AE_YA_PD_AUtexture_AE__AE_IUResourceDesc_AE__AE__AE_Z(uint32_t, struct ResourceDesc*) __ATTRIBUTELIST__((nothrow)) __asm__ ("?make_default_texture_view_from_desc@@YA?AUtexture@@IUResourceDesc@@@Z");
uint32_t _BA__PD_bloom_mips_for_dimensions_AE__AE_YAIII_AE_Z(uint32_t, uint32_t) __ATTRIBUTELIST__((always_inline, nothrow)) __asm__ ("?bloom_mips_for_dimensions@@YAIII@Z");
void _BA__PD_compute_bloom_from_hdr_AE__AE_YAXUtexture_AE__AE_UFilterConstants_AE__AE__AE_Z(struct texture*, struct FilterConstants*) __ATTRIBUTELIST__((always_inline, nothrow)) __asm__ ("?compute_bloom_from_hdr@@YAXUtexture@@UFilterConstants@@@Z");
void rpsl_M_3d_Fn_hello_rpsl(struct texture*, struct FilterConstants*) __ATTRIBUTELIST__((nothrow));
void ___rpsl_abort(uint32_t);
uint32_t ___rpsl_node_call(uint32_t, uint32_t, uint8_t**, uint32_t, uint32_t);
void ___rpsl_block_marker(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
void ___rpsl_describe_handle(uint8_t*, uint32_t, uint32_t*, uint32_t);
uint32_t ___rpsl_create_resource(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
void ___rpsl_name_resource(uint32_t, uint8_t*, uint32_t);
uint32_t ___rpsl_dxop_binary_i32(uint32_t, uint32_t, uint32_t);
void rpsl_M_3d_Fn_hello_rpsl_wrapper(uint32_t, uint8_t**, uint32_t) __ATTRIBUTELIST__((noinline, nothrow));

@FlorianHerickAMD
Copy link
Collaborator

Could you share with us your specific OS information, e.g. the output of cat /etc/os-release and the rpsl file used as source for the compiler? We are currently diagnosing an issue with the compiler that may be the cause of this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants