/** * Add a renderbuffer to the framebuffer. */ static boolean st_framebuffer_add_renderbuffer(struct st_framebuffer *stfb, gl_buffer_index idx) { struct gl_renderbuffer *rb; enum pipe_format format; int samples; boolean sw; if (!stfb->iface) return FALSE; /* do not distinguish depth/stencil buffers */ if (idx == BUFFER_STENCIL) idx = BUFFER_DEPTH; switch (idx) { case BUFFER_DEPTH: format = stfb->iface->visual->depth_stencil_format; sw = FALSE; break; case BUFFER_ACCUM: format = stfb->iface->visual->accum_format; sw = TRUE; break; default: format = stfb->iface->visual->color_format; sw = FALSE; break; } if (format == PIPE_FORMAT_NONE) return FALSE; samples = stfb->iface->visual->samples; if (!samples) samples = st_get_msaa(); rb = st_new_renderbuffer_fb(format, samples, sw); if (!rb) return FALSE; if (idx != BUFFER_DEPTH) { _mesa_add_renderbuffer(&stfb->Base, idx, rb); } else { if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0)) _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, rb); if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, rb); } return TRUE; }
struct st_framebuffer * st_create_framebuffer(const void *visual, enum pipe_format colorFormat, enum pipe_format depthFormat, enum pipe_format stencilFormat, uint width, uint height, void *privateData) { struct st_framebuffer *stfb = CALLOC_STRUCT(st_framebuffer); if (stfb) { struct st_renderbuffer *rb = st_new_renderbuffer_fb(colorFormat); stfb->strb = rb; #if 0 if (doubleBuffer) { struct st_renderbuffer *rb = st_new_renderbuffer_fb(colorFormat); } #endif /* we want to combine the depth/stencil */ if (stencilFormat == depthFormat) stfb->dsrb = st_new_renderbuffer_fb(stencilFormat); else stfb->dsrb = st_new_renderbuffer_fb(PIPE_FORMAT_S8Z24_UNORM); /*### currently we always allocate it but it's possible it's not necessary if EGL_ALPHA_MASK_SIZE was 0 */ stfb->alpha_mask = 0; stfb->init_width = width; stfb->init_height = height; stfb->privateData = privateData; } return stfb; }