/** * 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; }
static struct st_context * st_create_context_priv( GLcontext *ctx, struct pipe_context *pipe ) { uint i; struct st_context *st = ST_CALLOC_STRUCT( st_context ); ctx->st = st; st->ctx = ctx; st->pipe = pipe; /* XXX: this is one-off, per-screen init: */ st_debug_init(); /* state tracker needs the VBO module */ _vbo_CreateContext(ctx); st->dirty.mesa = ~0; st->dirty.st = ~0; st->cso_context = cso_create_context(pipe); st_init_atoms( st ); st_init_bitmap(st); st_init_clear(st); st_init_draw( st ); st_init_generate_mipmap(st); st_init_blit(st); if(pipe->screen->get_param(pipe->screen, PIPE_CAP_NPOT_TEXTURES)) st->internal_target = PIPE_TEXTURE_2D; else st->internal_target = PIPE_TEXTURE_RECT; for (i = 0; i < PIPE_MAX_SAMPLERS; i++) st->state.sampler_list[i] = &st->state.samplers[i]; for (i = 0; i < 3; i++) { memset(&st->velems_util_draw[i], 0, sizeof(struct pipe_vertex_element)); st->velems_util_draw[i].src_offset = i * 4 * sizeof(float); st->velems_util_draw[i].instance_divisor = 0; st->velems_util_draw[i].vertex_buffer_index = 0; st->velems_util_draw[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; } /* we want all vertex data to be placed in buffer objects */ vbo_use_buffer_objects(ctx); /* Need these flags: */ st->ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; st->ctx->VertexProgram._MaintainTnlProgram = GL_TRUE; st->pixel_xfer.cache = _mesa_new_program_cache(); st->force_msaa = st_get_msaa(); /* GL limits and extensions */ st_init_limits(st); st_init_extensions(st); return st; }