84 lines
2.5 KiB
Java
84 lines
2.5 KiB
Java
/*
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
|
* Send enquiries to dratcliffe@gmail.com
|
|
*/
|
|
package dan200.computercraft.client.util;
|
|
|
|
import com.mojang.blaze3d.platform.GlStateManager;
|
|
import org.lwjgl.opengl.GL;
|
|
import org.lwjgl.opengl.GL15C;
|
|
import org.lwjgl.opengl.GL45C;
|
|
import org.lwjgl.opengl.GLCapabilities;
|
|
import org.lwjgl.system.MemoryUtil;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
/**
|
|
* Provides utilities to interact with OpenGL's buffer objects, either using direct state access or binding/unbinding
|
|
* it.
|
|
*/
|
|
public class DirectBuffers
|
|
{
|
|
public static final boolean HAS_DSA;
|
|
|
|
static
|
|
{
|
|
GLCapabilities capabilities = GL.getCapabilities();
|
|
HAS_DSA = capabilities.OpenGL45 || capabilities.GL_ARB_direct_state_access;
|
|
}
|
|
|
|
public static int createBuffer()
|
|
{
|
|
return HAS_DSA ? GL45C.glCreateBuffers() : GL15C.glGenBuffers();
|
|
}
|
|
|
|
public static void setBufferData( int type, int id, ByteBuffer buffer, int flags )
|
|
{
|
|
if( HAS_DSA )
|
|
{
|
|
GL45C.glNamedBufferData( id, buffer, flags );
|
|
}
|
|
else
|
|
{
|
|
GlStateManager._glBindBuffer( type, id );
|
|
GlStateManager._glBufferData( type, buffer, GL15C.GL_STATIC_DRAW );
|
|
GlStateManager._glBindBuffer( type, 0 );
|
|
}
|
|
}
|
|
|
|
public static void setEmptyBufferData( int type, int id, int flags )
|
|
{
|
|
if( HAS_DSA )
|
|
{
|
|
GL45C.glNamedBufferData( id, 0, flags );
|
|
}
|
|
else
|
|
{
|
|
GlStateManager._glBindBuffer( type, id );
|
|
GL45C.glBufferData( type, 0, GL15C.GL_STATIC_DRAW );
|
|
GlStateManager._glBindBuffer( type, 0 );
|
|
}
|
|
}
|
|
|
|
private static final MemoryUtil.MemoryAllocator ALLOCATOR = MemoryUtil.getAllocator( false );
|
|
|
|
public static ByteBuffer createByteBuffer( int size )
|
|
{
|
|
long i = ALLOCATOR.malloc( size );
|
|
if( i == 0L ) throw new OutOfMemoryError( "Failed to allocate " + size + " bytes" );
|
|
return MemoryUtil.memByteBuffer( i, size );
|
|
}
|
|
|
|
public static ByteBuffer resizeByteBuffer( ByteBuffer buffer, int size )
|
|
{
|
|
long i = ALLOCATOR.realloc( MemoryUtil.memAddress0( buffer ), size );
|
|
if( i == 0L )
|
|
{
|
|
throw new OutOfMemoryError( "Failed to resize buffer from " + buffer.capacity() + " bytes to " + size + " bytes" );
|
|
}
|
|
|
|
return MemoryUtil.memByteBuffer( i, size );
|
|
}
|
|
}
|