format = fmt;
attachments.resize(format.size());
+ format_changed(format);
}
void Framebuffer::update() const
{
w = max(tex_cube->get_size()>>a.level, 1U);
h = w;
+ l = (a.layer<0 ? 6 : 1);
}
if(first)
}
}
-void Framebuffer::set_attachment(FrameAttachment attch, Texture &tex, unsigned level, int layer, unsigned samples)
+void Framebuffer::set_attachment(FrameAttachment attch, Texture &tex, Texture *res, unsigned level, int layer, unsigned samples)
{
if(format.empty() || attachments.empty())
throw invalid_operation("Framebuffer::attach");
{
if(a==attch)
{
- attachments[i].set(tex, level, layer);
+ attachments[i].set(tex, res, level, layer);
dirty |= 1<<i;
check_size();
return;
void Framebuffer::attach(FrameAttachment attch, Texture2D &tex, unsigned level)
{
- set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, 0, 0);
+ set_attachment(make_typed_attachment(attch, tex.get_format()), tex, 0, level, 0, 0);
}
-void Framebuffer::attach(FrameAttachment attch, Texture2DMultisample &tex)
+void Framebuffer::attach(FrameAttachment attch, Texture2DMultisample &tex, Texture2D *res)
{
- set_attachment(make_typed_attachment(attch, tex.get_format()), tex, 0, 0, tex.get_samples());
+ set_attachment(make_typed_attachment(attch, tex.get_format()), tex, res, 0, 0, tex.get_samples());
}
void Framebuffer::attach(FrameAttachment attch, Texture3D &tex, unsigned layer, unsigned level)
{
- set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, layer, 0);
+ set_attachment(make_typed_attachment(attch, tex.get_format()), tex, 0, level, layer, 0);
}
void Framebuffer::attach(FrameAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level)
{
- set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, face, 0);
+ set_attachment(make_typed_attachment(attch, tex.get_format()), tex, 0, level, face, 0);
}
void Framebuffer::attach_layered(FrameAttachment attch, Texture3D &tex, unsigned level)
{
require_layered();
- set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, -1, 0);
+ set_attachment(make_typed_attachment(attch, tex.get_format()), tex, 0, level, -1, 0);
}
void Framebuffer::attach_layered(FrameAttachment attch, TextureCube &tex, unsigned level)
{
require_layered();
- set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, -1, 0);
+ set_attachment(make_typed_attachment(attch, tex.get_format()), tex, 0, level, -1, 0);
}
void Framebuffer::detach(FrameAttachment attch)
return (i<attachments.size() ? attachments[i].tex : 0);
}
+const Texture *Framebuffer::get_resolve_attachment(FrameAttachment attch) const
+{
+ if(attachments.empty())
+ return 0;
+
+ int i = format.index(attch);
+ return (i>=0 ? attachments[i].resolve : 0);
+}
+
+const Texture *Framebuffer::get_resolve_attachment(unsigned i) const
+{
+ return (i<attachments.size() ? attachments[i].resolve : 0);
+}
+
+bool Framebuffer::has_resolve_attachments() const
+{
+ for(const Attachment &a: attachments)
+ if(a.resolve)
+ return true;
+ return false;
+}
+
void Framebuffer::require_complete() const
{
bool layered = (!attachments.empty() && attachments.front().layer<0);
}
-void Framebuffer::Attachment::set(Texture &t, unsigned l, int z)
+void Framebuffer::Attachment::set(Texture &t, Texture *r, unsigned l, int z)
{
tex = &t;
+ resolve = r;
level = l;
layer = z;
}