Framebuffer::Framebuffer(bool s):
- FramebufferBackend(s),
- dirty(0)
-{
- if(s)
- {
- format = get_system_format();
- get_system_size(width, height);
- }
-}
+ FramebufferBackend(s)
+{ }
Framebuffer::Framebuffer():
- FramebufferBackend(false),
- width(0),
- height(0),
- dirty(0)
+ FramebufferBackend(false)
{ }
Framebuffer::Framebuffer(FrameAttachment fa):
void Framebuffer::set_format(const FrameFormat &fmt)
{
- if(!format.empty() || !id)
+ if(!format.empty())
throw invalid_operation("Framebuffer::set_format");
if(fmt.empty() || !is_format_supported(fmt))
throw invalid_argument("Framebuffer::set_format");
{
unsigned w = 0;
unsigned h = 0;
+ unsigned l = 1;
if(const Texture2D *tex2d = dynamic_cast<const Texture2D *>(a.tex))
{
w = max(tex2d->get_width()>>a.level, 1U);
{
w = max(tex3d->get_width()>>a.level, 1U);
h = max(tex3d->get_height()>>a.level, 1U);
+ l = (a.layer<0 ? tex3d->get_depth() : 1);
}
else if(const TextureCube *tex_cube = dynamic_cast<const TextureCube *>(a.tex))
{
w = max(tex_cube->get_size()>>a.level, 1U);
h = w;
+ l = (a.layer<0 ? 6 : 1);
}
if(first)
{
width = w;
height = h;
+ layers = l;
first = false;
}
else
{
width = min(width, w);
height = min(height, h);
+ layers = min(layers, l);
}
}
}
void Framebuffer::set_attachment(FrameAttachment attch, Texture &tex, unsigned level, int layer, unsigned samples)
{
- if(format.empty() || !id)
+ if(format.empty() || attachments.empty())
throw invalid_operation("Framebuffer::attach");
if((format.get_samples()>1 && samples!=format.get_samples()) || (format.get_samples()==1 && samples))
void Framebuffer::detach(FrameAttachment attch)
{
- if(!id)
+ if(attachments.empty())
throw invalid_operation("Framebuffer::detach");
int i = format.index(attch);
}
}
-void Framebuffer::resize(const WindowView &view)
+const Texture *Framebuffer::get_attachment(FrameAttachment attch) const
{
- if(id)
- throw invalid_operation("Framebuffer::resize");
+ if(attachments.empty())
+ return 0;
- width = view.get_width();
- height = view.get_height();
+ int i = format.index(attch);
+ return (i>=0 ? attachments[i].tex : 0);
}
-void Framebuffer::require_complete() const
+const Texture *Framebuffer::get_attachment(unsigned i) const
{
- if(!id)
- return;
+ return (i<attachments.size() ? attachments[i].tex : 0);
+}
+void Framebuffer::require_complete() const
+{
bool layered = (!attachments.empty() && attachments.front().layer<0);
for(const Attachment &a: attachments)
{
FramebufferBackend::require_complete();
}
-Framebuffer &Framebuffer::system()
-{
- static Framebuffer sys_framebuf(true);
- return sys_framebuf;
-}
-
void Framebuffer::Attachment::set(Texture &t, unsigned l, int z)
{