Crash while calling VkCreateComputePipellienes on Adreno ( Oculus Quest )

Hi,

apologize if this is maybe not the correct place to ask this but I’ve seen some other post about Adreno GPU and this so I am just asking about some suggestions about what I could/should debug and/or if anyone else had same problems.

In essence “extremely simple compute shader” even just “a pure passthrough” or even a shader that does “absolutely nothing” no matter what any time I call :

result = vkCreateComputePipelines(DeviceParams.device, VK_NULL_HANDLE, 1,
&computePipelineCreateInfo, nullptr, the_pipeline);

On the Quest I ALWAYS get :

Signal = SIGSEGV ( signal SIGSEVG : invalid address ( fault address 0x3df8e9be534709) )

Despite same shader / pipeline / descriptors / etc. work with absolutely no problems at all on PC ( windows ), tried so many things I am starting to think “if that function works at all on the Quest”.

Yes I did post the same question on the Oculus forum as well but I very much doubt I’ll get any reply there, but maybe someone here had other experiences with Adreno GPU.

Shader compiled via the glslLangValidator tool and imported it in binary form into the Adreno.

Besides since quite some months I am working on all this I did find some peculiarities of the Adreno VS PC, unfortunately the fact a shader gets “properly compiled” into SPIRV does not mean at all it’s going to run on a given HW, in fact “the problems get out” the moment you call VkCreatePipelines() on a given HW, often with “super obscure error messages” telling absolutely nothing.

One thing I found out for example on the Adreno it seems NOT to like at all a “return” statement into any VS or FS shader, putting “return” statements into shaders seems to always fail pipeline creation.

But anyway, try as I may I could so far not make at all VkCreateComputePipelines() work and I don’t have any working sample.

Cheers.

Hi @GilesGoat

What Adreno GPU do you use ? Early version of Vulkan Driver for Adreno is not stability. I also had problem with vkCreateComputePipelines on Adreno:
do you have any error/warning messages from Vulkan’s Validation’s layers ?

Hi Andrey,

just a quick reply, I will check better on Monday but I am 100% sure I don’t get ANY errors from the validation layers.

( what I have to check I don’t know precisely what version of Adreno GPU is present on the Oculus Quest I have to run something and watch the logcat output ).

Real problem is that I don’t have any Oculus demo/sources/anything showing a use of compute shaders, the Adreno SDK is not made to work on Oculus and their sample as far as I can see “does nothing that special compared to my stuff” but even their sample compute shader would appear not to work.

On the other side I know “quite a number of people” complaining that Adreno is not a very stable/good GPU but eh we have to deal with it.

@GilesGoat Hi, try to ask on Qualcomm forum

Hi Andrey,
I already posted something in the Qualcomm forum ( attached to another existent thread ) maybe I’ll start a new post.

Anyway the info :


Device Name : Adreno ™ 540
Device Type : integrated GPU
Vendor ID : 0x5143
Device ID : 0x5040001
Driver Version : 512.513.0
API Version : 1.1.128
Queue Families : 0 = graphics (3 queues, 3 priorities)
Work Queue Family : 0
Present Queue Family : 0

And the stuff I keep getting is :

2020-12-07 11:07:32.658 15289-15580/com.oculus.sdk.VrGiles6 A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x3c6516be177655 in tid 15580 (OVR::Main)
2020-12-07 11:07:33.510 15289-15580/com.oculus.sdk.VrGiles6 E/crash-reporter-support: native-crash64 client received a negative request status from the crash server
2020-12-07 11:07:33.510 15289-15580/com.oculus.sdk.VrGiles6 I/crash-reporter: failed to capture minidump crash

I’ll try again to post something in Qualcomm hopefully I’ll get some reply :expressionless:

[edit] actually Here I already am.

Mah …

Hi, I am finding out something …

If I force this :

computePipelineCreateInfo.stage.module = nullptr;


result = vkCreateComputePipelines(DeviceParams.device, VK_NULL_HANDLE, 1,
        &computePipelineCreateInfo, nullptr, the_pipeline);

I get an error code ( VK_ERROR_UNKNOWN = -13 ) but not a crash, I did note the address where the error occurs appars to be “around where the module is”, which would seems to suggest that “maybe it does not like something in the compiled SPIRV shader”.

… AAAAAAAAAAAARGH …

… “or maybe that pointer is garbage or contains garbage ?” …

I forgot I use two totally different functions on PC and Android …

I was passing a “shader module” that was probably “just a pointer to nowhere”, now I’d expect at very least the VkCreateComputePipelines to check for the “magic number” 0x07230203 and throw an error if it can’t find it but maybe there was one “somewhere” mah.

So that’s how it was and why it wasn’t working …

// AAAAAAH THE COMPUTE SHADERS !! 07/12/2020

/*
if (sm == nullptr)
{
	if (stage == VK_SHADER_STAGE_VERTEX_BIT) sm = &vert_shader_module[index];
	else sm = &frag_shader_module[index];
}
*/

if (sm == nullptr)
{
	if (stage == VK_SHADER_STAGE_VERTEX_BIT) sm = &vert_shader_module[index];
	if (stage == VK_SHADER_STAGE_FRAGMENT_BIT) sm = &frag_shader_module[index];
	if (stage == VK_SHADER_STAGE_COMPUTE_BIT) sm = &comp_shader_module[index];
	if (stage == VK_SHADER_STAGE_VERTEX_BIT && true == multiview ) sm = &vert_shader_mv_module[index];
}

Basically it wasn’t a “vertex” so it defaulted to “fragment” actually I see what was going on, it was trying to use a fragment shader as a compute shader no wonders it wasn’t going anywhere …

Mea culpa.

At least the mystery is clarified, now let’s see if it works for real …

Cheers.