2017-11-10 6 views
0

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 : enter image description here

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!

Antwort

1

Sie haben vergessen, wie std140 Layout funktioniert. Elemente in Arrays von Grundtypen sind immer 16 Bytes groß. So ist Ihr uint values[256];wirklich ein uvec4 values[256];.

sollten Sie verwenden eine uvec4 values[64]; Array und Index es wie folgt aus:

outputBuffer.values[i] = inputBuffer.values[i/4][i % 4] * 2; 
Verwandte Themen