diff options
-rw-r--r-- | pipeline.cpp | 81 | ||||
-rw-r--r-- | video.hpp | 38 |
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() { @@ -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, |