X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_manager.c;h=2afc682e0b142167a2a505ba84f9826345a40e69;hb=f717fd25cc44d7dda5a49dc05337c7ee7c8d2d2f;hp=696d8aa792295b28c3d94c790dc7b7e05de0bfac;hpb=dff50ff592da7cb1d784fae794dd1647a5445bca;p=mesa.git diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index 696d8aa7922..2afc682e0b1 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -14,18 +14,19 @@ * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * Authors: * Chia-I Wu */ -#include "state_tracker/st_api.h" +#include "state_tracker/st_gl_api.h" #include "pipe/p_context.h" #include "pipe/p_screen.h" @@ -47,17 +48,9 @@ #include "st_context.h" #include "st_format.h" #include "st_cb_fbo.h" +#include "st_cb_flush.h" #include "st_manager.h" -/* these functions are defined in st_context.c */ -struct st_context * -st_create_context(struct pipe_context *pipe, - const __GLcontextModes *visual, - struct st_context *share); -void st_destroy_context(struct st_context *st); -void st_flush(struct st_context *st, uint pipeFlushFlags, - struct pipe_fence_handle **fence); - /** * Cast wrapper to convert a GLframebuffer to an st_framebuffer. * Return NULL if the GLframebuffer is a user-created framebuffer. @@ -149,7 +142,7 @@ static void st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st) { struct pipe_screen *screen = st->pipe->screen; - struct pipe_texture *textures[ST_ATTACHMENT_COUNT]; + struct pipe_resource *textures[ST_ATTACHMENT_COUNT]; uint width, height; unsigned i; boolean changed = FALSE; @@ -174,22 +167,22 @@ st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st) idx = attachment_to_buffer_index(stfb->statts[i]); if (idx >= BUFFER_COUNT) { - pipe_texture_reference(&textures[i], NULL); + pipe_resource_reference(&textures[i], NULL); continue; } strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer); assert(strb); if (strb->texture == textures[i]) { - pipe_texture_reference(&textures[i], NULL); + pipe_resource_reference(&textures[i], NULL); continue; } ps = screen->get_tex_surface(screen, textures[i], 0, 0, 0, - PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE); + PIPE_BIND_RENDER_TARGET); if (ps) { pipe_surface_reference(&strb->surface, ps); - pipe_texture_reference(&strb->texture, ps->texture); + pipe_resource_reference(&strb->texture, ps->texture); /* ownership transfered */ pipe_surface_reference(&ps, NULL); @@ -202,7 +195,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb, struct st_context *st) height = strb->Base.Height; } - pipe_texture_reference(&textures[i], NULL); + pipe_resource_reference(&textures[i], NULL); } if (changed) { @@ -497,7 +490,7 @@ st_context_flush(struct st_context_iface *stctxi, unsigned flags, static boolean st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target, int level, enum pipe_format internal_format, - struct pipe_texture *tex, boolean mipmap) + struct pipe_resource *tex, boolean mipmap) { struct st_context *st = (struct st_context *) stctxi; GLcontext *ctx = st->ctx; @@ -507,6 +500,7 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target struct st_texture_object *stObj; struct st_texture_image *stImage; GLenum internalFormat; + GLuint width, height, depth; switch (target) { case ST_TEXTURE_1D: @@ -526,12 +520,6 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target break; } - if (util_format_get_component_bits(internal_format, - UTIL_FORMAT_COLORSPACE_RGB, 3) > 0) - internalFormat = GL_RGBA; - else - internalFormat = GL_RGB; - texObj = _mesa_select_tex_object(ctx, texUnit, target); _mesa_lock_texture(ctx, texObj); @@ -545,18 +533,53 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target texImage = _mesa_get_tex_image(ctx, texObj, target, level); stImage = st_texture_image(texImage); if (tex) { + /* + * XXX When internal_format and tex->format differ, st_finalize_texture + * needs to allocate a new texture with internal_format and copy the + * texture here into the new one. It will result in surface_copy being + * called on surfaces whose formats differ. + * + * To avoid that, internal_format is (wrongly) ignored here. A sane fix + * is to use a sampler view. + */ + if (!st_sampler_compat_formats(tex->format, internal_format)) + internal_format = tex->format; + + if (util_format_get_component_bits(internal_format, + UTIL_FORMAT_COLORSPACE_RGB, 3) > 0) + internalFormat = GL_RGBA; + else + internalFormat = GL_RGB; _mesa_init_teximage_fields(ctx, target, texImage, tex->width0, tex->height0, 1, 0, internalFormat); texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat, GL_RGBA, GL_UNSIGNED_BYTE); _mesa_set_fetch_functions(texImage, 2); + + width = tex->width0; + height = tex->height0; + depth = tex->depth0; + + /* grow the image size until we hit level = 0 */ + while (level > 0) { + if (width != 1) + width <<= 1; + if (height != 1) + height <<= 1; + if (depth != 1) + depth <<= 1; + level--; + } } else { _mesa_clear_texture_image(ctx, texImage); + width = height = depth = 0; } - stObj->pipe = st->pipe; - pipe_texture_reference(&stImage->pt, tex); + pipe_resource_reference(&stImage->pt, tex); + stObj->width0 = width; + stObj->height0 = height; + stObj->depth0 = depth; _mesa_dirty_texobj(ctx, texObj, GL_TRUE); _mesa_unlock_texture(ctx, texObj); @@ -572,9 +595,9 @@ st_context_destroy(struct st_context_iface *stctxi) } static struct st_context_iface * -st_api_create_context(struct st_api *stapi, struct st_manager *smapi, - const struct st_visual *visual, - struct st_context_iface *shared_stctxi) +create_context(gl_api api, struct st_manager *smapi, + const struct st_visual *visual, + struct st_context_iface *shared_stctxi) { struct st_context *shared_ctx = (struct st_context *) shared_stctxi; struct st_context *st; @@ -586,26 +609,50 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi, return NULL; st_visual_to_context_mode(visual, &mode); - st = st_create_context(pipe, &mode, shared_ctx); + st = st_create_context(api, pipe, &mode, shared_ctx); if (!st) { pipe->destroy(pipe); return NULL; } - st->iface.destroy = st_context_destroy; + st->invalidate_on_gl_viewport = + smapi->get_param(smapi, ST_MANAGER_BROKEN_INVALIDATE); + st->iface.destroy = st_context_destroy; st->iface.notify_invalid_framebuffer = st_context_notify_invalid_framebuffer; st->iface.flush = st_context_flush; - st->iface.teximage = st_context_teximage; st->iface.copy = NULL; - st->iface.st_context_private = (void *) smapi; return &st->iface; } +static struct st_context_iface * +st_api_create_context(struct st_api *stapi, struct st_manager *smapi, + const struct st_visual *visual, + struct st_context_iface *shared_stctxi) +{ + return create_context(API_OPENGL, smapi, visual, shared_stctxi); +} + +static struct st_context_iface * +st_api_create_context_es1(struct st_api *stapi, struct st_manager *smapi, + const struct st_visual *visual, + struct st_context_iface *shared_stctxi) +{ + return create_context(API_OPENGLES, smapi, visual, shared_stctxi); +} + +static struct st_context_iface * +st_api_create_context_es2(struct st_api *stapi, struct st_manager *smapi, + const struct st_visual *visual, + struct st_context_iface *shared_stctxi) +{ + return create_context(API_OPENGLES2, smapi, visual, shared_stctxi); +} + static boolean st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi, struct st_framebuffer_iface *stdrawi, @@ -676,13 +723,6 @@ st_api_get_current(struct st_api *stapi) return (st) ? &st->iface : NULL; } -static boolean -st_api_is_visual_supported(struct st_api *stapi, - const struct st_visual *visual) -{ - return TRUE; -} - static st_proc_t st_api_get_proc_address(struct st_api *stapi, const char *procname) { @@ -692,7 +732,6 @@ st_api_get_proc_address(struct st_api *stapi, const char *procname) static void st_api_destroy(struct st_api *stapi) { - FREE(stapi); } /** @@ -709,14 +748,6 @@ st_manager_flush_frontbuffer(struct st_context *st) if (!strb) return; - /* st_public.h */ - if (!stfb->iface) { - struct pipe_surface *front_surf = strb->surface; - st->pipe->screen->flush_frontbuffer(st->pipe->screen, - front_surf, st->winsys_drawable_handle); - return; - } - stfb->iface->flush_front(stfb->iface, ST_ATTACHMENT_FRONT_LEFT); } @@ -736,14 +767,12 @@ st_manager_get_egl_image_surface(struct st_context *st, return NULL; memset(&stimg, 0, sizeof(stimg)); - stimg.stctxi = &st->iface; - stimg.egl_image = eglimg; - if (!smapi->get_egl_image(smapi, &stimg)) + if (!smapi->get_egl_image(smapi, &st->iface, eglimg, &stimg)) return NULL; ps = smapi->screen->get_tex_surface(smapi->screen, stimg.texture, stimg.face, stimg.level, stimg.zslice, usage); - pipe_texture_reference(&stimg.texture, NULL); + pipe_resource_reference(&stimg.texture, NULL); return ps; } @@ -757,14 +786,6 @@ st_manager_validate_framebuffers(struct st_context *st) struct st_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer); struct st_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer); - /* st_public.h */ - if ((stdraw && !stdraw->iface) || (stread && !stread->iface)) { - struct pipe_screen *screen = st->pipe->screen; - if (screen->update_buffer) - screen->update_buffer(screen, st->pipe->priv); - return; - } - if (stdraw) st_framebuffer_validate(stdraw, st); if (stread && stread != stdraw) @@ -780,8 +801,8 @@ st_manager_add_color_renderbuffer(struct st_context *st, GLframebuffer *fb, { struct st_framebuffer *stfb = st_ws_framebuffer(fb); - /* FBO or st_public.h */ - if (!stfb || !stfb->iface) + /* FBO */ + if (!stfb) return FALSE; if (stfb->Base.Attachment[idx].Renderbuffer) @@ -807,24 +828,60 @@ st_manager_add_color_renderbuffer(struct st_context *st, GLframebuffer *fb, return TRUE; } -/** - * Create an st_api to manage the state tracker. - */ +static const struct st_api st_gl_api = { + st_api_destroy, + st_api_get_proc_address, + st_api_create_context, + st_api_make_current, + st_api_get_current, +}; + +static const struct st_api st_gl_api_es1 = { + st_api_destroy, + st_api_get_proc_address, + st_api_create_context_es1, + st_api_make_current, + st_api_get_current, +}; + +static const struct st_api st_gl_api_es2 = { + st_api_destroy, + st_api_get_proc_address, + st_api_create_context_es2, + st_api_make_current, + st_api_get_current, +}; + struct st_api * -st_manager_create_api(void) +st_gl_api_create(void) { - struct st_api *stapi; - - stapi = CALLOC_STRUCT(st_api); - if (stapi) { - stapi->destroy = st_api_destroy; - stapi->get_proc_address = st_api_get_proc_address; - stapi->is_visual_supported = st_api_is_visual_supported; + (void) st_gl_api; + (void) st_gl_api_es1; + (void) st_gl_api_es2; + +#if FEATURE_GL + return (struct st_api *) &st_gl_api; +#else + return NULL; +#endif +} - stapi->create_context = st_api_create_context; - stapi->make_current = st_api_make_current; - stapi->get_current = st_api_get_current; - } +struct st_api * +st_gl_api_create_es1(void) +{ +#if FEATURE_ES1 + return (struct st_api *) &st_gl_api_es1; +#else + return NULL; +#endif +} - return stapi; +struct st_api * +st_gl_api_create_es2(void) +{ +#if FEATURE_ES2 + return (struct st_api *) &st_gl_api_es2; +#else + return NULL; +#endif }