More work on the GPU API

This commit is contained in:
Speiger 2026-05-28 13:31:16 +02:00
parent bc078abea4
commit c1f6c5ec10
27 changed files with 898 additions and 643 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>GameProject-SimpleJavaEngine</name>
<name>SimpleJavaEngine</name>
<comment></comment>
<projects>
</projects>

View File

@ -1,11 +1,11 @@
arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(9.1.0))
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=
java.home=C\:/Program Files/Java/jdk-25.0.2+10
java.home=C\:/Program Files/Java/jdk25
jvm.arguments=
offline.mode=false
override.workspace.settings=true

View File

@ -7,10 +7,23 @@ tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
eclipse {
classpath {
downloadJavadoc = true
downloadSources = true
file {
whenMerged { cp ->
cp.entries.forEach { entry ->
// Target the core LWJGL modules
if (entry.kind == 'lib' && entry.path.contains('org.lwjgl')) {
// Dynamically add a JPMS modular export rule to the Eclipse compiler
def rule = new org.gradle.plugins.ide.eclipse.model.AccessRule('accessible', 'org/lwjgl/system/**')
entry.accessRules.add(rule)
}
}
}
}
}
}
@ -29,7 +42,7 @@ repositories {
name = "Speiger Maven"
url = "https://maven.speiger.com/repository/main"
}
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://central.sonatype.com/repository/maven-snapshots" }
}

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -1,5 +0,0 @@
package speiger.src.coreengine.api.buffer;
public interface VertexBuffer {
}

View File

@ -1,5 +0,0 @@
package speiger.src.coreengine.api.core;
public interface GraphicsCommandQueue {
}

View File

@ -1,5 +0,0 @@
package speiger.src.coreengine.api.core;
public interface GraphicsResource {
public void remove();
}

View File

@ -1,6 +0,0 @@
package speiger.src.coreengine.api.texture;
public abstract class Texture {
protected final TextureType type = null;
}

View File

@ -0,0 +1,13 @@
package speiger.src.coreengine.graphics.api.buffer;
public enum BufferState {
STATIC_DRAW,
STATIC_READ,
STATIC_COPY,
STREAM_DRAW,
STREAM_READ,
STREAM_COPY,
DYNAMIC_DRAW,
DYNAMIC_READ,
DYNAMIC_COPY;
}

View File

@ -0,0 +1,44 @@
package speiger.src.coreengine.graphics.api.buffer;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import org.lwjgl.system.MemoryUtil;
import speiger.src.coreengine.graphics.api.core.GraphicsResource;
public abstract class VertexBuffer implements GraphicsResource {
protected final BufferState usage;
protected int size;
public VertexBuffer(BufferState usage, int size) {
this.usage = usage;
this.size = size;
}
public BufferState usage() {
return usage;
}
public int size() {
return size;
}
public abstract VertexBuffer allocate(int totalBytes);
public abstract VertexBuffer set(long pointer, int totalBytes);
public VertexBuffer set(ByteBuffer buffer) {
return set(MemoryUtil.memAddress(buffer), buffer.remaining());
}
public abstract VertexBuffer fill(long pointer, int totalBytes, int offset);
public VertexBuffer fill(int offset, ByteBuffer buffer) {
return fill(MemoryUtil.memAddress(buffer), buffer.remaining(), offset);
}
public abstract VertexBuffer read(long pointer, int totalbytes, int offset);
public VertexBuffer read(Buffer buffer, int totalBytes, int offset) {
return read(MemoryUtil.memAddress(buffer), totalBytes, offset);
}
}

View File

@ -1,4 +1,4 @@
package speiger.src.coreengine.api.core;
package speiger.src.coreengine.graphics.api.core;
import speiger.src.coreengine.rendering.input.window.Window;

View File

@ -0,0 +1,5 @@
package speiger.src.coreengine.graphics.api.core;
public interface GraphicsCommandQueue {
}

View File

@ -1,7 +1,7 @@
package speiger.src.coreengine.api.core;
package speiger.src.coreengine.graphics.api.core;
import speiger.src.coreengine.api.buffer.VertexBuffer;
import speiger.src.coreengine.api.texture.Texture;
import speiger.src.coreengine.graphics.api.buffer.VertexBuffer;
import speiger.src.coreengine.graphics.api.texture.Texture;
import speiger.src.coreengine.rendering.input.window.Window;
public interface GraphicsDevice {

View File

@ -0,0 +1,11 @@
package speiger.src.coreengine.graphics.api.core;
public interface GraphicsResource extends AutoCloseable {
public boolean isRemoved();
public void remove();
@Override
default void close() {
remove();
}
}

View File

@ -1,4 +1,4 @@
package speiger.src.coreengine.api.core;
package speiger.src.coreengine.graphics.api.core;
public interface GraphicsSurface {
public void setVsync(boolean value);

View File

@ -0,0 +1,13 @@
package speiger.src.coreengine.graphics.api.sampler;
public abstract class Sampler {
SamplerSettings settings;
public Sampler(SamplerSettings settings) {
this.settings = settings;
}
public SamplerSettings settings() {
return settings;
}
}

View File

@ -0,0 +1,5 @@
package speiger.src.coreengine.graphics.api.sampler;
public class SamplerSettings {
}

View File

@ -0,0 +1,16 @@
package speiger.src.coreengine.graphics.api.texture;
import speiger.src.coreengine.graphics.api.core.GraphicsResource;
public abstract class Texture implements GraphicsResource {
final TextureSettings settings;
public Texture(TextureSettings settings) {
this.settings = settings;
}
public TextureSettings settings() {
return settings;
}
}

View File

@ -0,0 +1,128 @@
package speiger.src.coreengine.graphics.api.texture;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.OptionalInt;
import speiger.src.collections.objects.lists.ImmutableObjectList;
import speiger.src.coreengine.graphics.api.texture.states.StencilType;
import speiger.src.coreengine.graphics.api.texture.states.SwizzleMask;
import speiger.src.coreengine.graphics.api.texture.states.TextureFormat;
import speiger.src.coreengine.graphics.api.texture.states.TextureType;
public record TextureSettings(TextureType type, TextureFormat internal, TextureFormat external, boolean generateMipmapping, OptionalInt baseLevel, OptionalInt maxLevel, List<Optional<SwizzleMask>> swizzle, Optional<StencilType> stencilType) {
public Builder copy() { return new Builder(this); }
public static Builder builder() { return new Builder(); }
public boolean hasSwizzle() {
for(int i = 0;i<4;i++) {
if(swizzle().get(i).isPresent()) return true;
}
return false;
}
public static class Builder {
TextureFormat internalFormat;
TextureFormat externalFormat;
TextureType type;
boolean generateMipmapping = false;
OptionalInt baseLevel = OptionalInt.empty();
OptionalInt maxLevel = OptionalInt.empty();
@SuppressWarnings("unchecked")
Optional<SwizzleMask>[] swizzle = new Optional[] {Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()};
Optional<StencilType> stencilType = Optional.empty();
private Builder() {}
private Builder(TextureSettings settings) {
type = settings.type;
internalFormat = settings.internal;
externalFormat = settings.external;
generateMipmapping = settings.generateMipmapping;
baseLevel = settings.baseLevel;
maxLevel = settings.maxLevel;
settings.swizzle.toArray(swizzle);
stencilType = settings.stencilType;
}
public TextureSettings build() {
return new TextureSettings(
Objects.requireNonNull(type, "Texture Type shouldn't be null"),
Objects.requireNonNull(internalFormat, "Internal Format shouldn't be null"),
Objects.requireNonNull(externalFormat, "External Format shouldn't be null"),
generateMipmapping, baseLevel, maxLevel, new ImmutableObjectList<>(swizzle), stencilType);
}
public Builder type(TextureType type) {
this.type = type;
return this;
}
public Builder format(TextureFormat format) {
this.internalFormat = format;
this.externalFormat = format;
return this;
}
public Builder internal(TextureFormat format) {
this.internalFormat = format;
return this;
}
public Builder external(TextureFormat format) {
this.externalFormat = format;
return this;
}
public Builder swizzle(SwizzleMask red, SwizzleMask green, SwizzleMask blue, SwizzleMask alpha) {
swizzle[0] = Optional.ofNullable(red);
swizzle[1] = Optional.ofNullable(green);
swizzle[2] = Optional.ofNullable(blue);
swizzle[3] = Optional.ofNullable(alpha);
return this;
}
public Builder swizzleRed(SwizzleMask mask) {
swizzle[0] = Optional.ofNullable(mask);
return this;
}
public Builder swizzleGreen(SwizzleMask mask) {
swizzle[1] = Optional.ofNullable(mask);
return this;
}
public Builder swizzleBlue(SwizzleMask mask) {
swizzle[2] = Optional.ofNullable(mask);
return this;
}
public Builder swizzleAlpha(SwizzleMask mask) {
swizzle[3] = Optional.ofNullable(mask);
return this;
}
public Builder stencil(StencilType type) {
stencilType = Optional.ofNullable(type);
return this;
}
public Builder generateMipmapping(boolean value) {
this.generateMipmapping = value;
return this;
}
public Builder mipMapping(int base, int max) {
this.baseLevel = OptionalInt.of(base);
this.maxLevel = OptionalInt.of(max);
return this;
}
public Builder clearmMipMapping() {
this.baseLevel = OptionalInt.empty();
this.maxLevel = OptionalInt.empty();
return this;
}
}
}

View File

@ -0,0 +1,6 @@
package speiger.src.coreengine.graphics.api.texture.states;
public enum StencilType {
DEPTH_COMPONENT,
STENCIL_INDEX
}

View File

@ -0,0 +1,10 @@
package speiger.src.coreengine.graphics.api.texture.states;
public enum SwizzleMask {
ZERO,
ONE,
RED,
GREEN,
BLUE,
ALPHA;
}

View File

@ -0,0 +1,11 @@
package speiger.src.coreengine.graphics.api.texture.states;
public enum TextureFormat {
R,
RGB,
RGBA,
DEPTH,
DEPTH_STENCIL,
LUMINANCE,
LUMINANCE_ALPHA
}

View File

@ -1,4 +1,4 @@
package speiger.src.coreengine.api.texture;
package speiger.src.coreengine.graphics.api.texture.states;
public enum TextureType {
TEXTURE_1D,

View File

@ -10,6 +10,7 @@ import org.lwjgl.opengl.GL43;
import org.lwjgl.system.Configuration;
import org.lwjgl.util.freetype.FreeType;
import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.AssetManager;