Skip to content

Commit

Permalink
Use CompletableFuture to simplify passing resources
Browse files Browse the repository at this point in the history
  • Loading branch information
ultraq committed Feb 2, 2024
1 parent fb904b5 commit 9daec28
Showing 1 changed file with 7 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ import org.slf4j.LoggerFactory
import static org.lwjgl.glfw.GLFW.*

import java.util.concurrent.BlockingQueue
import java.util.concurrent.Callable
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Future
import java.util.concurrent.LinkedBlockingQueue

Expand All @@ -53,8 +51,7 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests {
private final String windowTitle
private final GraphicsConfiguration config
private final InputEventStream inputEventStream
private final ExecutorService executorService = Executors.newCachedThreadPool()
private final BlockingQueue<Tuple2<Request, BlockingQueue>> creationRequests = new LinkedBlockingQueue<>()
private final BlockingQueue<Tuple2<Request, CompletableFuture<GraphicsResource>>> creationRequests = new LinkedBlockingQueue<>()
private final BlockingQueue<GraphicsResource> deletionRequests = new LinkedBlockingQueue<>()

private OpenGLContext context
Expand Down Expand Up @@ -150,26 +147,24 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests {

if (creationRequests) {
creationRequests.drain().each { creationRequest ->
def (request, pipe) = creationRequest
def (request, future) = creationRequest
var resource = switch (request) {
case ShaderRequest -> renderer.getShader(request.name())
case SpriteMeshRequest -> renderer.createSpriteMesh(surface: request.surface())
case TextureRequest -> renderer.createTexture(request.width(), request.height(), request.format(), request.data())
default -> throw new IllegalArgumentException("Cannot create resource from type ${request}")
}
pipe.add(resource)
future.complete(resource)
}
}
}

@Override
<V extends GraphicsResource, R extends Request<V>> Future<V> requestCreateOrGet(R request) {

return executorService.submit({ ->
var pipe = new LinkedBlockingQueue<V>(1)
creationRequests.add(new Tuple2(request, pipe))
return pipe.take()
} as Callable<V>)
var future = new CompletableFuture<V>()
creationRequests << new Tuple2(request, future)
return future
}

@Override
Expand Down

0 comments on commit 9daec28

Please sign in to comment.