/** * Decide the buffer to render to. */ static enum st_attachment_type choose_attachment(struct st_framebuffer_iface *stfbi) { enum st_attachment_type statt; statt = stfbi->visual->render_buffer; if (statt != ST_ATTACHMENT_INVALID) { /* use the buffer given by the visual, unless it is unavailable */ if (!st_visual_have_buffers(stfbi->visual, 1 << statt)) { switch (statt) { case ST_ATTACHMENT_BACK_LEFT: statt = ST_ATTACHMENT_FRONT_LEFT; break; case ST_ATTACHMENT_BACK_RIGHT: statt = ST_ATTACHMENT_FRONT_RIGHT; break; default: break; } if (!st_visual_have_buffers(stfbi->visual, 1 << statt)) statt = ST_ATTACHMENT_INVALID; } } return statt; }
/** * Determine the default draw or read buffer from a visual. */ static void st_visual_to_default_buffer(const struct st_visual *visual, GLenum *buffer, GLint *index) { enum st_attachment_type statt; GLenum buf; gl_buffer_index idx; statt = visual->render_buffer; /* do nothing if an invalid render buffer is specified */ if (statt == ST_ATTACHMENT_INVALID || !st_visual_have_buffers(visual, 1 << statt)) return; switch (statt) { case ST_ATTACHMENT_FRONT_LEFT: buf = GL_FRONT_LEFT; idx = BUFFER_FRONT_LEFT; break; case ST_ATTACHMENT_BACK_LEFT: buf = GL_BACK_LEFT; idx = BUFFER_BACK_LEFT; break; case ST_ATTACHMENT_FRONT_RIGHT: buf = GL_FRONT_RIGHT; idx = BUFFER_FRONT_RIGHT; break; case ST_ATTACHMENT_BACK_RIGHT: buf = GL_BACK_RIGHT; idx = BUFFER_BACK_RIGHT; break; default: buf = GL_NONE; idx = BUFFER_COUNT; break; } if (buf != GL_NONE) { if (buffer) *buffer = buf; if (index) *index = idx; } }
/** * Update the attachments to validate by looping the existing renderbuffers. */ static void st_framebuffer_update_attachments(struct st_framebuffer *stfb) { gl_buffer_index idx; stfb->num_statts = 0; for (idx = 0; idx < BUFFER_COUNT; idx++) { struct st_renderbuffer *strb; enum st_attachment_type statt; strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer); if (!strb || strb->software) continue; statt = buffer_index_to_attachment(idx); if (statt != ST_ATTACHMENT_INVALID && st_visual_have_buffers(stfb->iface->visual, 1 << statt)) stfb->statts[stfb->num_statts++] = statt; } stfb->stamp++; }
/** * Intialize a struct gl_config from a visual. */ static void st_visual_to_context_mode(const struct st_visual *visual, struct gl_config *mode) { memset(mode, 0, sizeof(*mode)); if (st_visual_have_buffers(visual, ST_ATTACHMENT_BACK_LEFT_MASK)) mode->doubleBufferMode = GL_TRUE; if (st_visual_have_buffers(visual, ST_ATTACHMENT_FRONT_RIGHT_MASK | ST_ATTACHMENT_BACK_RIGHT_MASK)) mode->stereoMode = GL_TRUE; if (visual->color_format != PIPE_FORMAT_NONE) { mode->rgbMode = GL_TRUE; mode->redBits = util_format_get_component_bits(visual->color_format, UTIL_FORMAT_COLORSPACE_RGB, 0); mode->greenBits = util_format_get_component_bits(visual->color_format, UTIL_FORMAT_COLORSPACE_RGB, 1); mode->blueBits = util_format_get_component_bits(visual->color_format, UTIL_FORMAT_COLORSPACE_RGB, 2); mode->alphaBits = util_format_get_component_bits(visual->color_format, UTIL_FORMAT_COLORSPACE_RGB, 3); mode->rgbBits = mode->redBits + mode->greenBits + mode->blueBits + mode->alphaBits; } if (visual->depth_stencil_format != PIPE_FORMAT_NONE) { mode->depthBits = util_format_get_component_bits(visual->depth_stencil_format, UTIL_FORMAT_COLORSPACE_ZS, 0); mode->stencilBits = util_format_get_component_bits(visual->depth_stencil_format, UTIL_FORMAT_COLORSPACE_ZS, 1); mode->haveDepthBuffer = mode->depthBits > 0; mode->haveStencilBuffer = mode->stencilBits > 0; } if (visual->accum_format != PIPE_FORMAT_NONE) { mode->haveAccumBuffer = GL_TRUE; mode->accumRedBits = util_format_get_component_bits(visual->accum_format, UTIL_FORMAT_COLORSPACE_RGB, 0); mode->accumGreenBits = util_format_get_component_bits(visual->accum_format, UTIL_FORMAT_COLORSPACE_RGB, 1); mode->accumBlueBits = util_format_get_component_bits(visual->accum_format, UTIL_FORMAT_COLORSPACE_RGB, 2); mode->accumAlphaBits = util_format_get_component_bits(visual->accum_format, UTIL_FORMAT_COLORSPACE_RGB, 3); } if (visual->samples) { mode->sampleBuffers = 1; mode->samples = visual->samples; } }