У меня были проблемы с этим в течение последних нескольких дней.Я читал много других SO сообщений и учебников: SO вопрос Учебник Khronos Это простая программа для ознакомления с буферами вычислений, прежде чем я займусь своей более крупной задачей.предполагается, что эта программа запускает только два потока, которые вставляют номер 1 в 1-й элемент буферного массива.
int main() {
int SIZE = 3;
float test[] = {0.f, 0.f, 0.f};
GLuint buf = 0;
// ... compile, setup code
glUseProgram(progHandle);
// some glUniform stuff to modify uniforms in shader
glGenBuffers (1, &buf);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buf);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(test), &test, GL_DYNAMIC_DRAW);
glDispatchCompute(SIZE/2, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);
GLfloat *p = NULL;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buf);
p = (GLfloat *) glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_ONLY);
if (p)
for(int i = 0; i < SIZE; i++)
test[i] = p[i];
else
printf("p is null %d\n", glGetError();
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);
p = NULL;
for(int i = 0; i < SIZE; i++)
std::cout << test[i] << " ";
}
Шейдер:
#version 430 core
layout (local_size_x = 2) in;
layout(std430, binding=0) writeonly buffer res {
float result[];
};
// some uniforms (these arn't being used rn)
void main(){
result[0] = 1.0f;
}
Вывод:
p is null: 0
0 0 0
Я бы ожидал 1 0 0, но по какой-то причине p всегда возвращается ноль и БЕЗ ошибки из glGetError.Если бы был низкий VMem, чем я ожидал бы ошибку NO_MEMORY, но тот факт, что NULL возвращается без ошибок, вызывает недоумение.Тем более, потому что этот код очень похож на связанный пост SO.
Я делаю проверку ошибок по всему коду (во время компоновки, компиляции, связывания), но один никогда не возникает.