Ich schrieb einen sehr einfachen Rechen Shader liest, und geht durch sie Deskriptorenmenge mit einer Größe von genau 1 KB gebunden einen einheitlichen Puffer liest als einen Array von uint
(s), dann wird für jedes Element, verdoppelt der Wert und schreibt das Ergebnis in einem anderen Zwischenspeicher zu Deskriptorenmenge gebunden (und auch in Shader natürlich definiert):Vulkan berechnet Shader nur Teile des einheitlichen Puffers
#version 450 core
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(set = 0, binding = 0) uniform InputBuffer
{
uint values[256];
} inputBuffer;
layout(set = 0, binding = 1) buffer OutputBuffer
{
uint values[256];
} outputBuffer;
void main(void)
{
for(int i = 0; i < 256; i++) {
outputBuffer.values[i] = inputBuffer.values[i] * 2;
}
return;
}
die Eingangsdaten wird durch die einheitliche vorgesehen Puffer, dessen Speicher vor runni zugewiesen und geschrieben wird ng den Shader. Ich überschreiben einfach jedes Byte mit dem Wert von :
memset(*mappedMemory, 3, 1024);
Die von Shader in den Speicherpuffer geschrieben Ergebniswerte seltsam ist, scheint ein Viertel der Daten korrekt zu sein, das Ergebnis, gefüllt mit 0s :
I mehrere Stellen in dem Code in die eine Größe oder versetzt überprüft, um Vulkan-Funktionen vorgesehen ist, und alle von ihnen sind 1024 (1 KB) und , respectively.
Ich denke, das könnte daran liegen, wie Vulkan compute Shader liest Daten aus einheitlichen Pufferspeicher, und std140 Datenlayout könnte die Ursache für dieses Problem sein, aber nach meinem besten Wissen, die Tutorials/Spezifikationen nicht erwähnt alles dazwischen Offset-Anforderungen!