Changes in v3: - Rework to use the bind flags Changes in v2: - No longer set the flag in compress_with_blit depending on NPOT, let the driver do that if needed
Allow to pass flags to st_texture_create and take advantage of that to tell the pipe driver that a texture is going to be used with unnormalized coordinates. This is useful for hardware with no mipmapped NPOT support that needs to allocate texture rectangles in a special way (e.g. nv30). --- src/mesa/state_tracker/st_cb_texture.c | 22 ++++++++++++++-------- src/mesa/state_tracker/st_format.c | 15 ++++++++++----- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index bc0af17..aa20131 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -209,22 +209,28 @@ do_memcpy(void *dest, const void *src, size_t n) * Return default texture resource binding bitmask for the given format. */ static GLuint -default_bindings(struct st_context *st, enum pipe_format format) +default_bindings(struct st_context *st, GLenum target, enum pipe_format format) { struct pipe_screen *screen = st->pipe->screen; - const unsigned target = PIPE_TEXTURE_2D; const unsigned geom = 0x0; unsigned bindings; + unsigned sampler_view_binding; if (util_format_is_depth_or_stencil(format)) - bindings = PIPE_BIND_SAMPLER_VIEW_ALL | PIPE_BIND_DEPTH_STENCIL; + bindings = PIPE_BIND_DEPTH_STENCIL; else - bindings = PIPE_BIND_SAMPLER_VIEW_ALL | PIPE_BIND_RENDER_TARGET; + bindings = PIPE_BIND_RENDER_TARGET; - if (screen->is_format_supported(screen, format, target, 0, bindings, geom)) + if(target == GL_TEXTURE_RECTANGLE) + sampler_view_binding = PIPE_BIND_SAMPLER_VIEW_UNNORMALIZED_CLAMP; + else + sampler_view_binding = PIPE_BIND_SAMPLER_VIEW_NORMALIZED; + bindings |= sampler_view_binding; + + if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, bindings, geom)) return bindings; else - return PIPE_BIND_SAMPLER_VIEW_ALL; + return sampler_view_binding; } @@ -341,7 +347,7 @@ guess_and_alloc_texture(struct st_context *st, fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); - bindings = default_bindings(st, fmt); + bindings = default_bindings(st, stObj->base.Target, fmt); stObj->pt = st_texture_create(st, gl_target_to_pipe(stObj->base.Target), @@ -1866,7 +1872,7 @@ st_finalize_texture(GLcontext *ctx, /* May need to create a new gallium texture: */ if (!stObj->pt) { - GLuint bindings = default_bindings(st, firstImageFormat); + GLuint bindings = default_bindings(st, stObj->base.Target, firstImageFormat); stObj->pt = st_texture_create(st, gl_target_to_pipe(stObj->base.Target), diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index e2ba006..ed53439 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -717,19 +717,24 @@ st_ChooseTextureFormat(GLcontext *ctx, GLint internalFormat, { struct pipe_screen *screen = st_context(ctx)->pipe->screen; enum pipe_format pFormat; - uint bindings; + uint bindings, sampler_view_binding; (void) format; - (void) type; /* GL textures may wind up being render targets, but we don't know * that in advance. Specify potential render target flags now. */ if (_mesa_is_depth_format(internalFormat) || _mesa_is_depthstencil_format(internalFormat)) - bindings = PIPE_BIND_SAMPLER_VIEW_ALL | PIPE_BIND_DEPTH_STENCIL; + bindings = PIPE_BIND_DEPTH_STENCIL; else - bindings = PIPE_BIND_SAMPLER_VIEW_ALL | PIPE_BIND_RENDER_TARGET; + bindings = PIPE_BIND_RENDER_TARGET; + + if(type == GL_TEXTURE_RECTANGLE) + sampler_view_binding = PIPE_BIND_SAMPLER_VIEW_UNNORMALIZED_CLAMP; + else + sampler_view_binding = PIPE_BIND_SAMPLER_VIEW_NORMALIZED; + bindings |= sampler_view_binding; pFormat = st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D, 0, bindings); @@ -737,7 +742,7 @@ st_ChooseTextureFormat(GLcontext *ctx, GLint internalFormat, if (pFormat == PIPE_FORMAT_NONE) { /* try choosing format again, this time without render target bindings */ pFormat = st_choose_format(screen, internalFormat, - PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW_ALL); + PIPE_TEXTURE_2D, 0, sampler_view_binding); } if (pFormat == PIPE_FORMAT_NONE) { -- 1.7.0.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev