Package org.terasology.engine.subsystem.lwjgl

Source Code of org.terasology.engine.subsystem.lwjgl.GLBufferPool

/*
* Copyright 2014 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.engine.subsystem.lwjgl;

import gnu.trove.list.TIntList;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL15;
import org.terasology.rendering.VertexBufferObjectUtil;

import java.nio.IntBuffer;

/**
* @author Immortius
*/
public class GLBufferPool {

    private static final int BUFFER_FETCH_SIZE = 16;

    private boolean traceBufferUsage;
    private int totalPoolSize;

    private TIntList pool = new TIntArrayList();

    private TIntObjectMap<String> usageTracker;

    public GLBufferPool(boolean traceBufferUsage) {
        this.traceBufferUsage = traceBufferUsage;
        if (traceBufferUsage) {
            usageTracker = new TIntObjectHashMap<>();
        }
    }


    public int get(String forUseBy) {
        if (pool.isEmpty()) {
            IntBuffer buffer = BufferUtils.createIntBuffer(BUFFER_FETCH_SIZE);
            GL15.glGenBuffers(buffer);
            for (int i = 0; i < BUFFER_FETCH_SIZE; ++i) {
                pool.add(buffer.get(i));
            }
            totalPoolSize += BUFFER_FETCH_SIZE;
        }

        int result = pool.removeAt(pool.size() - 1);
        if (traceBufferUsage) {
            usageTracker.put(result, forUseBy);
        }
        return result;
    }

    public void dispose(int buffer) {
        if (buffer != 0) {
            pool.add(buffer);
            IntBuffer dataBuffer = BufferUtils.createIntBuffer(1);
            dataBuffer.put(0);
            dataBuffer.flip();
            VertexBufferObjectUtil.bufferVboData(buffer, dataBuffer, GL15.GL_STATIC_DRAW);
            dataBuffer.flip();

            if (traceBufferUsage) {
                usageTracker.remove(buffer);
            }
        }
    }

    public int getActivePoolSize() {
        return totalPoolSize - pool.size();
    }

    public String getUsageMap() {
        if (traceBufferUsage) {
            return usageTracker.toString();
        }
        return "Tracing disabled";
    }

}
TOP

Related Classes of org.terasology.engine.subsystem.lwjgl.GLBufferPool

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.