aligned_alloc и glTexSubImage2D вызывают ошибку сегментации

#opengl-4

#opengl-4

Вопрос:

Я пытаюсь инициализировать текстуру (в opengl). Если блок, переданный в glTexSubImage2D, выделен с помощью malloc, инициализация работает хорошо. Если я использую aligned_alloc, я получаю, в большинстве случаев, ошибку сегментации. Почему ?

Минимальный фрагмент кода для воспроизведения проблемы:

 GLuint texture_id;
GLenum err;

int sx = 2048;
int sy = 1024;
char *data = (char *)aligned_alloc(sizeof(char)*sx*sy*3, ALIGN_VALUE);
//char *data = (char *)malloc(sizeof(char)*sx*sy*3);

glGenTextures(1, amp;texture_id);
glActiveTexture(texture_unit);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, sx, sy);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, sx, sy, GL_BGR, GL_UNSIGNED_BYTE, data);
  

Valgrind перечисляет множество ошибок с aligned_alloc . Два (как и первый) на memalign в позиции вызова aligned_alloc. Все остальные (многие, подобные второму) в позиции команды glTexSubImage2D.

 ==7042== Invalid read of size 1
==7042==    at 0x4045F71: ??? (in /tmp/.glamhkos (deleted))
==7042==    by 0xCFFFFFF: ???
==7042==    by 0xD68A04F: ???
==7042==    by 0xFFEFFFE3F: ???
==7042==  Address 0xd000002 is 0 bytes after a block of size 2 alloc'd
==7042==    at 0x4C2B1B6: memalign (vg_replace_malloc.c:760)
...
==7042==    by 0x4016E1: main (in /.../)


==7042== Invalid read of size 1
==7042==    at 0x4045F71: ??? (in /tmp/.glamhkos (deleted))
==7042==    by 0xD0017FF: ???
==7042==    by 0xD68C04F: ???
==7042==    by 0xFFEFFFE3F: ???
==7042==    by 0x1: ???
==7042==    by 0x7B23325: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79)
==7042==    by 0x7B2D9A6: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79)
==7042==    by 0x7C7DD40: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79)
==7042==    by 0x7C51383: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79)
==7042==    by 0x7C52A16: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79)
==7042==    by 0x7C6F553: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79)
...
==7042==  Address 0xd001802 is 6,146 bytes inside a block of size 6,852,752 in arena "client"
  

Изменение ALIGN_VALUE не помогает.

Valgrind не выводит никаких ошибок при использовании malloc.

Ответ №1:

Я неправильно использую aligned_alloc(sizeof(char)sx sy * 3, ALIGN_VALUE) в моем минимальном примере. Неверные параметры.

Используйте вместо этого : aligned_alloc(ALIGN_VALUE, sizeof(char)sx sy * 3)