static void st_egl_image_target_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, GLeglImageOES image_handle) { struct st_context *st = st_context(ctx); struct st_renderbuffer *strb = st_renderbuffer(rb); struct pipe_surface *ps; unsigned usage; usage = PIPE_BIND_RENDER_TARGET; ps = st_manager_get_egl_image_surface(st, (void *) image_handle, usage); if (ps) { strb->Base.Width = ps->width; strb->Base.Height = ps->height; strb->Base.Format = st_pipe_format_to_mesa_format(ps->format); strb->Base.DataType = st_format_datatype(ps->format); strb->Base._BaseFormat = st_pipe_format_to_base_format(ps->format); strb->Base.InternalFormat = strb->Base._BaseFormat; pipe_surface_reference(&strb->surface, ps); pipe_resource_reference(&strb->texture, ps->texture); pipe_surface_reference(&ps, NULL); } }
/** * gl_renderbuffer::AllocStorage() * This is called to allocate the original drawing surface, and * during window resize. */ static GLboolean st_renderbuffer_alloc_storage(struct gl_context * ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height) { struct st_context *st = st_context(ctx); struct pipe_context *pipe = st->pipe; struct pipe_screen *screen = st->pipe->screen; struct st_renderbuffer *strb = st_renderbuffer(rb); enum pipe_format format; struct pipe_surface surf_tmpl; format = st_choose_renderbuffer_format(screen, internalFormat, rb->NumSamples); if (format == PIPE_FORMAT_NONE) { return FALSE; } /* init renderbuffer fields */ strb->Base.Width = width; strb->Base.Height = height; strb->Base.Format = st_pipe_format_to_mesa_format(format); strb->Base._BaseFormat = _mesa_base_fbo_format(ctx, internalFormat); strb->Base.DataType = st_format_datatype(format); strb->format = format; strb->defined = GL_FALSE; /* undefined contents now */ if (strb->software) { size_t size; free(strb->data); assert(strb->format != PIPE_FORMAT_NONE); strb->stride = util_format_get_stride(strb->format, width); size = util_format_get_2d_size(strb->format, strb->stride, height); strb->data = malloc(size); return strb->data != NULL; } else { struct pipe_resource template; /* Free the old surface and texture */ pipe_surface_reference( &strb->surface, NULL ); pipe_resource_reference( &strb->texture, NULL ); pipe_sampler_view_reference(&strb->sampler_view, NULL); /* Setup new texture template. */ memset(&template, 0, sizeof(template));
/** * Compute the renderbuffer's Red/Green/EtcBit fields from the pipe format. */ static int init_renderbuffer_bits(struct st_renderbuffer *strb, enum pipe_format pipeFormat) { struct pipe_format_info info; if (!st_get_format_info( pipeFormat, &info )) { assert( 0 ); } strb->Base.Format = info.mesa_format; strb->Base.DataType = st_format_datatype(pipeFormat); return info.size; }
/** * Compute the renderbuffer's Red/Green/EtcBit fields from the pipe format. */ static int init_renderbuffer_bits(struct st_renderbuffer *strb, enum pipe_format pipeFormat) { struct pipe_format_info info; if (!st_get_format_info( pipeFormat, &info )) { assert( 0 ); } strb->Base._ActualFormat = info.base_format; strb->Base.RedBits = info.red_bits; strb->Base.GreenBits = info.green_bits; strb->Base.BlueBits = info.blue_bits; strb->Base.AlphaBits = info.alpha_bits; strb->Base.DepthBits = info.depth_bits; strb->Base.StencilBits = info.stencil_bits; strb->Base.DataType = st_format_datatype(pipeFormat); return info.size; }