Ошибка при загрузке текстуры из IntBuffer-а

Версия Minecraft
1.16.5
API
Forge
4,045
63
645
Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
Такую штуку получаю при попытке записать текстуру из бит буфера.

Краш указывает вот на эту строчку:
GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, xOffset, yOffset, width, height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buf);

Что делаю:
Создаю текстуру с определённым размером и записываю её в бит буфер. Далее гружу всё это в GL.
В определённые моменты размер текстуры меняется...
Естественно, бит буфер пересоздаю, текстуру биндю заново и пересчитываю.

Java:
static int offset;
static int size;

// в какой-то момент меняется offset
// после этого вызываю prepareImage()

public static void prepareImage() {
    size = (offset * 2 + 1) << 4;
    buf = BufferUtils.createIntBuffer(size * size);
    TextureUtil.prepareImage(textureId, size, size);
    ... // занова создаю текстуру и пишу в буфер
    upload(0, 0, size, size);
}

private static void upload(int xOffset, int yOffset, int width, int height) {
    bindTexture();
    boolean offset = xOffset > 0 || yOffset > 0;
    if (offset) {
        setPosition(xOffset, yOffset);
        GL11.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, size);
    }
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
    GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, xOffset, yOffset, width, height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buf); // тут краш
    if (offset) {
        setPosition(0, 0);
        GL11.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
    }
}

Если размер текстуры становится меньше, всё работает, если больше - игра вылетает и выдаёт ошибку...
 
Краш-лог
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000012d5f66e, pid=2036, tid=0x0000000000001950
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C 0x0000000012d5f66e
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

--------------- T H R E A D ---------------

Current thread (0x00000000020ac000): JavaThread "Render thread" [_thread_in_native, id=6480, stack(0x0000000002180000,0x0000000002280000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x000000002ccb5000

Registers:
RAX=0x0000000000000000, RBX=0x0000000000000000, RCX=0x0000000000000004, RDX=0x0000000000000000
RSP=0x000000000227d3e8, RBP=0x0000000000000230, RSI=0x000000002ccb5000, RDI=0x000000003614e940
R8 =0x0000000000000290, R9 =0x000000003614e7c0, R10=0x000000002ccb4e80, R11=0x000000003614e7c0
R12=0x0000000000000000, R13=0x0000000000000000, R14=0x000000005f319260, R15=0x0000000000000001
RIP=0x0000000012d5f66e, EFLAGS=0x0000000000010206

Top of Stack: (sp=0x000000000227d3e8)
0x000000000227d3e8: 0000000000000009 0000000000000290
0x000000000227d3f8: 000000000227d5d0 000000001c6a0000
0x000000000227d408: 000000005f31c6d4 0000000022fe7ca0
0x000000000227d418: 000000005f195c22 0000000000000000
0x000000000227d428: 0000000000000000 000000005f31c680
0x000000000227d438: 000000001c6a0000 0000000000000001
0x000000000227d448: 000000005f31ec7d 000000000227d5d0
0x000000000227d458: 0000000000000001 0000000022e2b090
0x000000000227d468: 0000000000000004 0000005200000052
0x000000000227d478: 0000000000000005 0000000000000000
0x000000000227d488: 0000000000000000 0000000000000001
0x000000000227d498: 0000000000000000 0000000022e2b090
0x000000000227d4a8: 000000001c6a0000 0000000022fe7ca0
0x000000000227d4b8: 000000005f4246a9 000000000227d5c0
0x000000000227d4c8: 0000000000000000 0000000000000000
0x000000000227d4d8: ffffffff00000004 0000000000000000

Instructions: (pc=0x0000000012d5f66e)
0x0000000012d5f64e: 8b f2 49 8b fb 41 8b e8 85 ed 0f 84 4a 00 00 00
0x0000000012d5f65e: b9 04 00 00 00 0f 8f 05 00 00 00 48 f7 d9 f7 dd
0x0000000012d5f66e: 8b 1e 48 03 f1 48 83 c7 04 8b c3 8b d3 81 e0 00
0x0000000012d5f67e: 00 ff 00 c1 e8 10 81 e3 00 ff 00 00 0b d8 8b c2


Register to memory mapping:

RAX=0x0000000000000000 is an unknown value
RBX=0x0000000000000000 is an unknown value
RCX=0x0000000000000004 is an unknown value
RDX=0x0000000000000000 is an unknown value
RSP=0x000000000227d3e8 is pointing into the stack for thread: 0x00000000020ac000
RBP=0x0000000000000230 is an unknown value
RSI=0x000000002ccb5000 is an unknown value
RDI=0x000000003614e940 is an unknown value
R8 =0x0000000000000290 is an unknown value
R9 =0x000000003614e7c0 is an unknown value
R10=0x000000002ccb4e80 is an unknown value
R11=0x000000003614e7c0 is an unknown value
R12=0x0000000000000000 is an unknown value
R13=0x0000000000000000 is an unknown value
R14=0x000000005f319260 is an unknown value
R15=0x0000000000000001 is an unknown value


Stack: [0x0000000002180000,0x0000000002280000], sp=0x000000000227d3e8, free space=1012k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C 0x0000000012d5f66e

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 11761 org.lwjgl.opengl.GL11C.nglTexSubImage2D(IIIIIIIIJ)V (0 bytes) @ 0x0000000004242f3c [0x0000000004242ec0+0x7c]
j org.lwjgl.opengl.GL11C.glTexSubImage2D(IIIIIIIILjava/nio/IntBuffer;)V+17
j org.lwjgl.opengl.GL11.glTexSubImage2D(IIIIIIIILjava/nio/IntBuffer;)V+14
j ru.liahim.mist.client.shader.FogTexture.upload(IIII)V+74
j ru.liahim.mist.client.shader.FogTexture.createFogTexture(Lnet/minecraft/world/World;II)V+74
J 22003 C1 ru.liahim.mist.handlers.Fog.prepareFogParameters(F)V (321 bytes) @ 0x000000000570db24 [0x000000000570d180+0x9a4]
J 22001 C1 ru.liahim.mist.handlers.Fog.renderWorldLastEvent(Lnet/minecraftforge/client/event/RenderWorldLastEvent;)V (43 bytes) @ 0x0000000005776454 [0x0000000005776080+0x3d4]
Краш-лог:
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000012d5f66e, pid=2036, tid=0x0000000000001950
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  0x0000000012d5f66e
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  T H R E A D  ---------------

Current thread (0x00000000020ac000):  JavaThread "Render thread" [_thread_in_native, id=6480, stack(0x0000000002180000,0x0000000002280000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x000000002ccb5000

Registers:
RAX=0x0000000000000000, RBX=0x0000000000000000, RCX=0x0000000000000004, RDX=0x0000000000000000
RSP=0x000000000227d3e8, RBP=0x0000000000000230, RSI=0x000000002ccb5000, RDI=0x000000003614e940
R8 =0x0000000000000290, R9 =0x000000003614e7c0, R10=0x000000002ccb4e80, R11=0x000000003614e7c0
R12=0x0000000000000000, R13=0x0000000000000000, R14=0x000000005f319260, R15=0x0000000000000001
RIP=0x0000000012d5f66e, EFLAGS=0x0000000000010206

Top of Stack: (sp=0x000000000227d3e8)
0x000000000227d3e8:   0000000000000009 0000000000000290
0x000000000227d3f8:   000000000227d5d0 000000001c6a0000
0x000000000227d408:   000000005f31c6d4 0000000022fe7ca0
0x000000000227d418:   000000005f195c22 0000000000000000
0x000000000227d428:   0000000000000000 000000005f31c680
0x000000000227d438:   000000001c6a0000 0000000000000001
0x000000000227d448:   000000005f31ec7d 000000000227d5d0
0x000000000227d458:   0000000000000001 0000000022e2b090
0x000000000227d468:   0000000000000004 0000005200000052
0x000000000227d478:   0000000000000005 0000000000000000
0x000000000227d488:   0000000000000000 0000000000000001
0x000000000227d498:   0000000000000000 0000000022e2b090
0x000000000227d4a8:   000000001c6a0000 0000000022fe7ca0
0x000000000227d4b8:   000000005f4246a9 000000000227d5c0
0x000000000227d4c8:   0000000000000000 0000000000000000
0x000000000227d4d8:   ffffffff00000004 0000000000000000 

Instructions: (pc=0x0000000012d5f66e)
0x0000000012d5f64e:   8b f2 49 8b fb 41 8b e8 85 ed 0f 84 4a 00 00 00
0x0000000012d5f65e:   b9 04 00 00 00 0f 8f 05 00 00 00 48 f7 d9 f7 dd
0x0000000012d5f66e:   8b 1e 48 03 f1 48 83 c7 04 8b c3 8b d3 81 e0 00
0x0000000012d5f67e:   00 ff 00 c1 e8 10 81 e3 00 ff 00 00 0b d8 8b c2 


Register to memory mapping:

RAX=0x0000000000000000 is an unknown value
RBX=0x0000000000000000 is an unknown value
RCX=0x0000000000000004 is an unknown value
RDX=0x0000000000000000 is an unknown value
RSP=0x000000000227d3e8 is pointing into the stack for thread: 0x00000000020ac000
RBP=0x0000000000000230 is an unknown value
RSI=0x000000002ccb5000 is an unknown value
RDI=0x000000003614e940 is an unknown value
R8 =0x0000000000000290 is an unknown value
R9 =0x000000003614e7c0 is an unknown value
R10=0x000000002ccb4e80 is an unknown value
R11=0x000000003614e7c0 is an unknown value
R12=0x0000000000000000 is an unknown value
R13=0x0000000000000000 is an unknown value
R14=0x000000005f319260 is an unknown value
R15=0x0000000000000001 is an unknown value


Stack: [0x0000000002180000,0x0000000002280000],  sp=0x000000000227d3e8,  free space=1012k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  0x0000000012d5f66e

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 11761  org.lwjgl.opengl.GL11C.nglTexSubImage2D(IIIIIIIIJ)V (0 bytes) @ 0x0000000004242f3c [0x0000000004242ec0+0x7c]
j  org.lwjgl.opengl.GL11C.glTexSubImage2D(IIIIIIIILjava/nio/IntBuffer;)V+17
j  org.lwjgl.opengl.GL11.glTexSubImage2D(IIIIIIIILjava/nio/IntBuffer;)V+14
j  ru.liahim.mist.client.shader.FogTexture.upload(IIII)V+74
j  ru.liahim.mist.client.shader.FogTexture.createFogTexture(Lnet/minecraft/world/World;II)V+74
J 22003 C1 ru.liahim.mist.handlers.Fog.prepareFogParameters(F)V (321 bytes) @ 0x000000000570db24 [0x000000000570d180+0x9a4]
J 22001 C1 ru.liahim.mist.handlers.Fog.renderWorldLastEvent(Lnet/minecraftforge/client/event/RenderWorldLastEvent;)V (43 bytes) @ 0x0000000005776454 [0x0000000005776080+0x3d4]
Решение
Юху!
Проблема решена! 🥳

Ну и, по традиции, для всех, кроме @tox1cozZ-а )
В общем, на версии 1.16.5 можанги сильно мусорят и не хотят за собой убирать.
Пришлось чистить ещё и вот эти два параметра:
Java:
GlStateManager._pixelStore(GL11.GL_UNPACK_SKIP_PIXELS, 0);
GlStateManager._pixelStore(GL11.GL_UNPACK_SKIP_ROWS, 0);
4,045
63
645
Обознался.
Проверка потоков проблему не решила...
Код изменился следующим образов:

Java:
private static void upload(int xOffset, int yOffset, int width, int height) {
    // Собственно, проверка как в ваниле 
    if (RenderSystem.isOnRenderThreadOrInit()) uploadImage(xOffset, yOffset, width, height);
    else RenderSystem.recordRenderCall(() -> uploadImage(xOffset, yOffset, width, height));
}

private static void uploadImage(int xOffset, int yOffset, int width, int height) {
    bindTexture();
    setPosition(xOffset, yOffset);
    RenderSystem.pixelStore(GL11.GL_UNPACK_ROW_LENGTH, size);
    RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
    RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
    GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, xOffset, yOffset, width, height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buf);
}

private static void setPosition(int x, int y) {
    buf.position(y * size + x);
}

Ошибка та же... И при таких же условиях.

Кроме того, заметил странность:
Если грузить буфер куском (с каким-либо смещением) текстура скачет каждый раз по разному...
Бывают моменты, когда текстура вообще разлетается на полосочки... При следующей загрузке и аналогичных условиях всё работает.
Такое ощущение, что длина строки (UNPACK_ROW_LENGTH) успевает поменяться с момента её установки мной, до загрузки текстуры.

Призываю великого и могучего @Dahaka
 
2,505
81
397
glTexSubImage2D не выделяет память. Для перевыделения есть glTexImage2D.
И в твоём случае получается, что выделена память под текстуру размеров wTex и hTex, и при попытк залить туда что-то большее - вылетает краш.

Что за size в GL_UNPACK_ROW_LENGTH? Там должна быть реальная ширина текстуры, т.е. wTex.
 
4,045
63
645
Да, это и есть ширина текстуры...
Смотри код в первом сообщении:
Java:
buf = BufferUtils.createIntBuffer(size * size);
TextureUtil.prepareImage(textureId, size, size);

Под капотом у TextureUtil как раз и вызывается glTexImage2D.
Кроме того, я пробовал вызывать разные методы: при нулевом оффсете вызывать glTexImage2D, а при загрузке фрагмента glTexSubImage2D. И ошибка остаётся.
 
4,045
63
645
Юху!
Проблема решена! 🥳

Ну и, по традиции, для всех, кроме @tox1cozZ-а )
В общем, на версии 1.16.5 можанги сильно мусорят и не хотят за собой убирать.
Пришлось чистить ещё и вот эти два параметра:
Java:
GlStateManager._pixelStore(GL11.GL_UNPACK_SKIP_PIXELS, 0);
GlStateManager._pixelStore(GL11.GL_UNPACK_SKIP_ROWS, 0);
 
Сверху