add yoga double free minimization
Some checks reported errors
studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit

This commit is contained in:
austin 2024-08-28 21:36:46 -04:00
parent bca1789457
commit fc4730c24a
11 changed files with 97 additions and 75 deletions

View File

@ -6,6 +6,7 @@ import java.util.Map;
import org.joml.Vector2i; import org.joml.Vector2i;
import org.lwjgl.opengl.GL40; import org.lwjgl.opengl.GL40;
import electrosphere.engine.Globals;
import electrosphere.renderer.shader.ShaderProgram; import electrosphere.renderer.shader.ShaderProgram;
/** /**
@ -179,6 +180,7 @@ public class OpenGLState {
if(DISABLE_CACHING || program != activeShader){ if(DISABLE_CACHING || program != activeShader){
activeShader = program; activeShader = program;
GL40.glUseProgram(activeShader.getShaderId()); GL40.glUseProgram(activeShader.getShaderId());
Globals.renderingEngine.checkError();
renderPipelineState.setCurrentShaderPointer(activeShader.getShaderId()); renderPipelineState.setCurrentShaderPointer(activeShader.getShaderId());
} }
} }

View File

@ -9,11 +9,13 @@ import org.joml.Vector3f;
import org.lwjgl.BufferUtils; import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL31;
import org.lwjgl.opengl.GL40;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.entity.types.camera.CameraEntityUtils; import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.logger.LoggerInterface; import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.OpenGLState; import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderingEngine;
import electrosphere.renderer.shader.ShaderProgram; import electrosphere.renderer.shader.ShaderProgram;
/** /**
@ -158,7 +160,11 @@ public class LightManager {
public void bindBuffer(OpenGLState openGLState){ public void bindBuffer(OpenGLState openGLState){
//get position of lights object in shader //get position of lights object in shader
int bufferIndex = GL31.glGetUniformBlockIndex(openGLState.getActiveShader().getShaderId(), "Lights"); int bufferIndex = GL31.glGetUniformBlockIndex(openGLState.getActiveShader().getShaderId(), "Lights");
Globals.renderingEngine.checkError(); int glErrorCode = Globals.renderingEngine.getError();
//TODO: fix manually ignoring GL_INVALID_VALUE from call
if(glErrorCode != 0 && glErrorCode != GL40.GL_INVALID_VALUE){
LoggerInterface.loggerRenderer.DEBUG_LOOP(RenderingEngine.getErrorInEnglish(glErrorCode));
}
if(bufferIndex == ShaderProgram.INVALID_UNIFORM_NAME){ if(bufferIndex == ShaderProgram.INVALID_UNIFORM_NAME){
LoggerInterface.loggerRenderer.INFO("Tried to buffer light manager to shader that does not have it active."); LoggerInterface.loggerRenderer.INFO("Tried to buffer light manager to shader that does not have it active.");
} else { } else {

View File

@ -365,7 +365,6 @@ public class Mesh {
selectedProgram = shader; selectedProgram = shader;
} }
openGLState.setActiveShader(renderPipelineState, selectedProgram); openGLState.setActiveShader(renderPipelineState, selectedProgram);
Globals.renderingEngine.checkError();
} }
if(renderPipelineState.getUseLight()){ if(renderPipelineState.getUseLight()){

View File

@ -7,6 +7,7 @@ import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.model.Material; import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model; import electrosphere.renderer.model.Model;
import electrosphere.renderer.ui.elementtypes.DrawableElement; import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.Event; import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.Font; import electrosphere.renderer.ui.font.Font;
import org.joml.Vector3f; import org.joml.Vector3f;
@ -127,6 +128,7 @@ public class BitmapCharacter extends StandardElement implements DrawableElement
@Override @Override
public void applyYoga(int parentX, int parentY) { public void applyYoga(int parentX, int parentY) {
if(this.yogaNode != Element.NULL_YOGA_ELEMENT){
//get the values from yoga //get the values from yoga
float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode); float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode);
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode); float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
@ -141,5 +143,6 @@ public class BitmapCharacter extends StandardElement implements DrawableElement
this.absoluteY = parentY + internalPositionY; this.absoluteY = parentY + internalPositionY;
} }
} }
}
} }

View File

@ -76,7 +76,7 @@ public class Label extends StandardContainerElement implements DrawableElement {
void generateLetters(){ void generateLetters(){
//free children //free children
for(Element child : childList){ for(Element child : childList){
Yoga.YGNodeFree(child.getYogaNode()); child.destroy();
} }
childList.clear(); childList.clear();
int accumulatingWidth = 0; int accumulatingWidth = 0;

View File

@ -238,11 +238,14 @@ public class StandardContainerElement extends StandardElement implements Contain
for(Element child : childList){ for(Element child : childList){
child.destroy(); child.destroy();
} }
if(this.yogaNode != Element.NULL_YOGA_ELEMENT){
Yoga.YGNodeFree(this.yogaNode); Yoga.YGNodeFree(this.yogaNode);
} }
}
@Override @Override
public void applyYoga(int parentX, int parentY) { public void applyYoga(int parentX, int parentY) {
if(this.yogaNode != Element.NULL_YOGA_ELEMENT){
//get the values from yoga //get the values from yoga
float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode); float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode);
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode); float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
@ -265,6 +268,7 @@ public class StandardContainerElement extends StandardElement implements Contain
child.applyYoga(parentX + internalPositionX,parentY + internalPositionY); child.applyYoga(parentX + internalPositionX,parentY + internalPositionY);
} }
} }
}
@Override @Override
public void setJustifyContent(YogaJustification justification){ public void setJustifyContent(YogaJustification justification){

View File

@ -157,7 +157,10 @@ public class StandardElement implements Element {
@Override @Override
public void destroy(){ public void destroy(){
if(this.yogaNode != Element.NULL_YOGA_ELEMENT){
Yoga.YGNodeFree(this.yogaNode); Yoga.YGNodeFree(this.yogaNode);
this.yogaNode = Element.NULL_YOGA_ELEMENT;
}
} }
@Override @Override
@ -167,6 +170,7 @@ public class StandardElement implements Element {
@Override @Override
public void applyYoga(int parentX, int parentY) { public void applyYoga(int parentX, int parentY) {
if(this.yogaNode != Element.NULL_YOGA_ELEMENT){
//get the values from yoga //get the values from yoga
float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode); float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode);
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode); float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
@ -183,6 +187,7 @@ public class StandardElement implements Element {
this.absoluteY = parentY + internalPositionY; this.absoluteY = parentY + internalPositionY;
} }
} }
}

View File

@ -1,7 +1,5 @@
package electrosphere.renderer.ui.elements; package electrosphere.renderer.ui.elements;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.renderer.OpenGLState; import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState; import electrosphere.renderer.RenderPipelineState;
@ -110,7 +108,7 @@ public class TextBox extends StandardDrawableContainerElement {
void generateLetters(){ void generateLetters(){
//free children //free children
for(Element child : childList){ for(Element child : childList){
Yoga.YGNodeFree(child.getYogaNode()); child.destroy();
} }
childList.clear(); childList.clear();
String[] words = text.split(" "); String[] words = text.split(" ");

View File

@ -355,6 +355,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
@Override @Override
public void applyYoga(int parentX, int parentY) { public void applyYoga(int parentX, int parentY) {
if(this.yogaNode != Element.NULL_YOGA_ELEMENT){
Yoga.YGNodeStyleSetWidth(parentWindowYogaNode, Globals.WINDOW_WIDTH); Yoga.YGNodeStyleSetWidth(parentWindowYogaNode, Globals.WINDOW_WIDTH);
Yoga.YGNodeStyleSetHeight(parentWindowYogaNode, Globals.WINDOW_HEIGHT); Yoga.YGNodeStyleSetHeight(parentWindowYogaNode, Globals.WINDOW_HEIGHT);
//calculate yoga layout //calculate yoga layout
@ -375,6 +376,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
child.applyYoga(this.positionX,this.positionY); child.applyYoga(this.positionX,this.positionY);
} }
} }
}
@Override @Override
public void setDirection(int layout) { public void setDirection(int layout) {

View File

@ -1,7 +1,5 @@
package electrosphere.renderer.ui.elements; package electrosphere.renderer.ui.elements;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.logger.LoggerInterface; import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.OpenGLState; import electrosphere.renderer.OpenGLState;
@ -88,7 +86,7 @@ public class Word extends StandardDrawableContainerElement {
void generateLetters(){ void generateLetters(){
//free children //free children
for(Element child : childList){ for(Element child : childList){
Yoga.YGNodeFree(child.getYogaNode()); child.destroy();
} }
childList.clear(); childList.clear();
for(int i = 0; i < text.length(); i++){ for(int i = 0; i < text.length(); i++){

View File

@ -4,6 +4,11 @@ import electrosphere.renderer.ui.events.Event;
public interface Element { public interface Element {
/**
* A yoga element that either hasn't been created or has already been destroyed
*/
public static final int NULL_YOGA_ELEMENT = -1;
//width and height //width and height
public int getWidth(); public int getWidth();
public int getHeight(); public int getHeight();