summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2025-02-09 19:29:28 +1100
committerquou <quou@disroot.org>2025-02-12 23:57:48 +1100
commit5d5a21dec0c865c35297cad03b7b5c61043ca8c3 (patch)
treec084e5433f8406e7275d0636660efd5b1add8e9f
parent0de071eb23d6774042e7f466591483b4e72e9473 (diff)
make the pipeline builder a bit cleaner to use
-rw-r--r--pipeline.cpp81
-rw-r--r--video.hpp38
2 files changed, 77 insertions, 42 deletions
diff --git a/pipeline.cpp b/pipeline.cpp
index 647ff49..b187807 100644
--- a/pipeline.cpp
+++ b/pipeline.cpp
@@ -11,12 +11,13 @@ extern "C" {
Pipeline_Builder::Pipeline_Builder(Arena* arena, Device* dev):
arena(arena), dev(dev) {}
-void Pipeline_Builder::begin_rp() {
+Pipeline_Builder& Pipeline_Builder::begin_rp() {
pass = (Render_Pass*)arena_alloc(arena, sizeof *pass);
zero(pass, sizeof *pass);
+ return *this;
}
-void Pipeline_Builder::rp_target(Texture_Id id, Colour clear) {
+Pipeline_Builder& Pipeline_Builder::rp_target(Texture_Id id, Colour clear) {
int i = pass->colour_count++;
Texture& texture = dev->get_texture(id);
Render_Pass::Target t{
@@ -27,9 +28,10 @@ void Pipeline_Builder::rp_target(Texture_Id id, Colour clear) {
};
assert(i < max_colour_attachments);
pass->colours[i] = t;
+ return *this;
}
-void Pipeline_Builder::rp_target(Texture_Id id, Clear_Mode clear) {
+Pipeline_Builder& Pipeline_Builder::rp_target(Texture_Id id, Clear_Mode clear) {
int i = pass->colour_count++;
Texture& texture = dev->get_texture(id);
Render_Pass::Target t{
@@ -41,9 +43,10 @@ void Pipeline_Builder::rp_target(Texture_Id id, Clear_Mode clear) {
assert(i < max_colour_attachments);
assert(clear != Clear_Mode::clear);
pass->colours[i] = t;
+ return *this;
}
-void Pipeline_Builder::rp_depth_target(Texture_Id id, float clear) {
+Pipeline_Builder& Pipeline_Builder::rp_depth_target(Texture_Id id, float clear) {
Texture& texture = dev->get_texture(id);
Render_Pass::Target t{
.id = id,
@@ -52,9 +55,10 @@ void Pipeline_Builder::rp_depth_target(Texture_Id id, float clear) {
.clear = { .depth = clear }
};
pass->depth = t;
+ return *this;
}
-void Pipeline_Builder::rp_depth_target(Texture_Id id, Clear_Mode mode) {
+Pipeline_Builder& Pipeline_Builder::rp_depth_target(Texture_Id id, Clear_Mode mode) {
Texture& texture = dev->get_texture(id);
Render_Pass::Target t{
.id = id,
@@ -64,6 +68,7 @@ void Pipeline_Builder::rp_depth_target(Texture_Id id, Clear_Mode mode) {
};
assert(mode != Clear_Mode::clear);
pass->depth = t;
+ return *this;
}
void Pipeline_Builder::validate_rp() {
@@ -118,24 +123,40 @@ Render_Pass& Pipeline_Builder::build_rp() {
return *pass;
}
-void Pipeline_Builder::begin() {
+Pipeline_Builder& Pipeline_Builder::begin(const Render_Pass* p) {
pip = (Pipeline*)arena_alloc(arena, sizeof *pip);
zero(pip, sizeof *pip);
if (dev) {
- Texture_Id backbuffer_id = dev->get_backbuffer();
- Texture& backbuffer = dev->get_texture(backbuffer_id);
+ int w = 0, h = 0;
+ if (p) {
+ if (p->depth.id) {
+ Texture& d = dev->get_texture(p->depth.id);
+ w = d.w;
+ h = d.h;
+ } else if (p->colour_count) {
+ Texture& c = dev->get_texture(p->colours[0].id);
+ w = c.w;
+ h = c.h;
+ }
+ } else {
+ Texture_Id backbuffer_id = dev->get_backbuffer();
+ Texture& backbuffer = dev->get_texture(backbuffer_id);
+ w = backbuffer.w;
+ h = backbuffer.h;
+ }
pip->scissor[0] = 0;
pip->scissor[1] = 0;
- pip->scissor[2] = backbuffer.w;
- pip->scissor[3] = backbuffer.h;
+ pip->scissor[2] = w;
+ pip->scissor[3] = h;
pip->viewport[0] = 0;
pip->viewport[1] = 0;
- pip->viewport[2] = backbuffer.w;
- pip->viewport[3] = backbuffer.h;
+ pip->viewport[2] = w;
+ pip->viewport[3] = h;
}
+ return *this;
}
-void Pipeline_Builder::viewport(
+Pipeline_Builder& Pipeline_Builder::viewport(
int x,
int y,
int w,
@@ -145,9 +166,10 @@ void Pipeline_Builder::viewport(
pip->viewport[1] = y;
pip->viewport[2] = w;
pip->viewport[3] = h;
+ return *this;
}
-void Pipeline_Builder::scissor(
+Pipeline_Builder& Pipeline_Builder::scissor(
int x,
int y,
int w,
@@ -157,19 +179,22 @@ void Pipeline_Builder::scissor(
pip->scissor[1] = y;
pip->scissor[2] = w;
pip->scissor[3] = h;
+ return *this;
}
-void Pipeline_Builder::depth(bool test, bool write, Depth_Mode mode) {
+Pipeline_Builder& Pipeline_Builder::depth(bool test, bool write, Depth_Mode mode) {
pip->depth_test = test;
pip->depth_write = write;
pip->depth_mode = mode;
+ return *this;
}
-void Pipeline_Builder::geo(Geo_Type type) {
+Pipeline_Builder& Pipeline_Builder::geo(Geo_Type type) {
pip->geo = type;
+ return *this;
}
-void Pipeline_Builder::blend(
+Pipeline_Builder& Pipeline_Builder::blend(
Blend_Mode mode,
Blend_Factor src,
Blend_Factor dst
@@ -182,13 +207,15 @@ void Pipeline_Builder::blend(
src,
dst
);
+ return *this;
}
-void Pipeline_Builder::cull(Cull_Mode mode) {
+Pipeline_Builder& Pipeline_Builder::cull(Cull_Mode mode) {
pip->cull_mode = mode;
+ return *this;
}
-void Pipeline_Builder::blend(
+Pipeline_Builder& Pipeline_Builder::blend(
Blend_Mode mode_col,
Blend_Factor src_col,
Blend_Factor dst_col,
@@ -203,13 +230,15 @@ void Pipeline_Builder::blend(
pip->blend_mode_alpha = mode_alpha;
pip->blend_src_alpha = src_alpha;
pip->blend_dst_alpha = dst_alpha;
+ return *this;
}
-void Pipeline_Builder::shader(Shader_Id s) {
+Pipeline_Builder& Pipeline_Builder::shader(Shader_Id s) {
pip->shader = s;
+ return *this;
}
-void Pipeline_Builder::texture(
+Pipeline_Builder& Pipeline_Builder::texture(
int binding,
Texture_Id t,
Sampler_Id s
@@ -223,9 +252,10 @@ void Pipeline_Builder::texture(
d->type = Descriptor::Type::texture;
td->sampler = s;
td->texture = t;
+ return *this;
}
-void Pipeline_Builder::cbuffer(
+Pipeline_Builder& Pipeline_Builder::cbuffer(
int binding,
Buffer_Id id,
int offset,
@@ -241,9 +271,10 @@ void Pipeline_Builder::cbuffer(
cd->buffer = id;
cd->offset = offset;
cd->size = size;
+ return *this;
}
-void Pipeline_Builder::sbuffer(
+Pipeline_Builder& Pipeline_Builder::sbuffer(
int binding,
Buffer_Id id,
int offset,
@@ -259,10 +290,12 @@ void Pipeline_Builder::sbuffer(
cd->buffer = id;
cd->offset = offset;
cd->size = size;
+ return *this;
}
-void Pipeline_Builder::vertex_format(Vertex_Format_Id vf) {
+Pipeline_Builder& Pipeline_Builder::vertex_format(Vertex_Format_Id vf) {
pip->vertex_format = vf;
+ return *this;
}
Pipeline& Pipeline_Builder::build() {
diff --git a/video.hpp b/video.hpp
index ccc1f11..b8293fa 100644
--- a/video.hpp
+++ b/video.hpp
@@ -298,21 +298,23 @@ struct Pipeline_Builder {
Pipeline_Builder(Arena* arena, Device* dev);
- void begin_rp();
- void rp_target(Texture_Id id, Colour clear_colour);
- void rp_target(Texture_Id id, Clear_Mode mode);
- void rp_depth_target(Texture_Id id, float clear_depth);
- void rp_depth_target(Texture_Id id, Clear_Mode mode);
+ using PB = Pipeline_Builder&;
+
+ PB& begin_rp();
+ PB& rp_target(Texture_Id id, Colour clear_colour);
+ PB& rp_target(Texture_Id id, Clear_Mode mode);
+ PB& rp_depth_target(Texture_Id id, float clear_depth);
+ PB& rp_depth_target(Texture_Id id, Clear_Mode mode);
Render_Pass& build_rp();
void validate_rp();
- void begin();
- void viewport(int x, int y, int w, int h);
- void scissor(int x, int y, int w, int h);
- void depth(bool test, bool write, Depth_Mode mode);
- void geo(Geo_Type type);
- void blend(Blend_Mode mode, Blend_Factor src, Blend_Factor dst);
- void blend(
+ PB& begin(const Render_Pass* p = 0);
+ PB& viewport(int x, int y, int w, int h);
+ PB& scissor(int x, int y, int w, int h);
+ PB& depth(bool test, bool write, Depth_Mode mode);
+ PB& geo(Geo_Type type);
+ PB& blend(Blend_Mode mode, Blend_Factor src, Blend_Factor dst);
+ PB& blend(
Blend_Mode mode_col,
Blend_Factor src_col,
Blend_Factor dst_col,
@@ -320,17 +322,17 @@ struct Pipeline_Builder {
Blend_Factor src_alpha,
Blend_Factor dst_alpha
);
- void cull(Cull_Mode mode);
- void shader(Shader_Id s);
- void vertex_format(Vertex_Format_Id vf);
- void texture(int binding, Texture_Id t, Sampler_Id s);
- void cbuffer(
+ PB& cull(Cull_Mode mode);
+ PB& shader(Shader_Id s);
+ PB& vertex_format(Vertex_Format_Id vf);
+ PB& texture(int binding, Texture_Id t, Sampler_Id s);
+ PB& cbuffer(
int binding,
Buffer_Id id,
int offset = 0,
int size = 0
);
- void sbuffer(
+ PB& sbuffer(
int binding,
Buffer_Id id,
int offset = 0,