gallium: change remaining util functions to use cso sampler views
changes arguments of util_blit_pixels_tex and util_gen_mipmap to struct pipe_sampler_view * instead of struct pipe_texture *.
This commit is contained in:
committed by
Michal Krol
parent
e4b8a307b2
commit
8f55a95178
@@ -555,21 +555,23 @@ void util_blit_flush( struct blit_state *ctx )
|
||||
*/
|
||||
void
|
||||
util_blit_pixels_tex(struct blit_state *ctx,
|
||||
struct pipe_texture *tex,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
int dstX0, int dstY0,
|
||||
int dstX1, int dstY1,
|
||||
float z, uint filter)
|
||||
struct pipe_sampler_view *src_sampler_view,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
int dstX0, int dstY0,
|
||||
int dstX1, int dstY1,
|
||||
float z, uint filter)
|
||||
{
|
||||
struct pipe_framebuffer_state fb;
|
||||
float s0, t0, s1, t1;
|
||||
unsigned offset;
|
||||
struct pipe_texture *tex = src_sampler_view->texture;
|
||||
|
||||
assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
|
||||
filter == PIPE_TEX_MIPFILTER_LINEAR);
|
||||
|
||||
assert(tex);
|
||||
assert(tex->width0 != 0);
|
||||
assert(tex->height0 != 0);
|
||||
|
||||
@@ -588,7 +590,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
||||
cso_save_depth_stencil_alpha(ctx->cso);
|
||||
cso_save_rasterizer(ctx->cso);
|
||||
cso_save_samplers(ctx->cso);
|
||||
cso_save_sampler_textures(ctx->cso);
|
||||
cso_save_fragment_sampler_views(ctx->cso);
|
||||
cso_save_framebuffer(ctx->cso);
|
||||
cso_save_fragment_shader(ctx->cso);
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
@@ -620,7 +622,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
||||
cso_set_viewport(ctx->cso, &ctx->viewport);
|
||||
|
||||
/* texture */
|
||||
cso_set_sampler_textures(ctx->cso, 1, &tex);
|
||||
cso_set_fragment_sampler_views(ctx->cso, 1, &src_sampler_view);
|
||||
|
||||
/* shaders */
|
||||
cso_set_fragment_shader_handle(ctx->cso, ctx->fs[TGSI_WRITEMASK_XYZW]);
|
||||
@@ -654,7 +656,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
||||
cso_restore_depth_stencil_alpha(ctx->cso);
|
||||
cso_restore_rasterizer(ctx->cso);
|
||||
cso_restore_samplers(ctx->cso);
|
||||
cso_restore_sampler_textures(ctx->cso);
|
||||
cso_restore_fragment_sampler_views(ctx->cso);
|
||||
cso_restore_framebuffer(ctx->cso);
|
||||
cso_restore_fragment_shader(ctx->cso);
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
|
||||
@@ -75,7 +75,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
||||
|
||||
extern void
|
||||
util_blit_pixels_tex(struct blit_state *ctx,
|
||||
struct pipe_texture *tex,
|
||||
struct pipe_sampler_view *src_sampler_view,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
|
||||
@@ -1460,7 +1460,7 @@ void util_gen_mipmap_flush( struct gen_mipmap_state *ctx )
|
||||
* Generate mipmap images. It's assumed all needed texture memory is
|
||||
* already allocated.
|
||||
*
|
||||
* \param pt the texture to generate mipmap levels for
|
||||
* \param psv the sampler view to the texture to generate mipmap levels for
|
||||
* \param face which cube face to generate mipmaps for (0 for non-cube maps)
|
||||
* \param baseLevel the first mipmap level to use as a src
|
||||
* \param lastLevel the last mipmap level to generate
|
||||
@@ -1469,12 +1469,13 @@ void util_gen_mipmap_flush( struct gen_mipmap_state *ctx )
|
||||
*/
|
||||
void
|
||||
util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
struct pipe_texture *pt,
|
||||
struct pipe_sampler_view *psv,
|
||||
uint face, uint baseLevel, uint lastLevel, uint filter)
|
||||
{
|
||||
struct pipe_context *pipe = ctx->pipe;
|
||||
struct pipe_screen *screen = pipe->screen;
|
||||
struct pipe_framebuffer_state fb;
|
||||
struct pipe_texture *pt = psv->texture;
|
||||
void *fs = (pt->target == PIPE_TEXTURE_CUBE) ? ctx->fsCube : ctx->fs2d;
|
||||
uint dstLevel;
|
||||
uint zslice = 0;
|
||||
@@ -1492,7 +1493,7 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
filter == PIPE_TEX_FILTER_NEAREST);
|
||||
|
||||
/* check if we can render in the texture's format */
|
||||
if (!screen->is_format_supported(screen, pt->format, PIPE_TEXTURE_2D,
|
||||
if (!screen->is_format_supported(screen, psv->format, PIPE_TEXTURE_2D,
|
||||
PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) {
|
||||
fallback_gen_mipmap(ctx, pt, face, baseLevel, lastLevel);
|
||||
return;
|
||||
@@ -1503,7 +1504,7 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
cso_save_depth_stencil_alpha(ctx->cso);
|
||||
cso_save_rasterizer(ctx->cso);
|
||||
cso_save_samplers(ctx->cso);
|
||||
cso_save_sampler_textures(ctx->cso);
|
||||
cso_save_fragment_sampler_views(ctx->cso);
|
||||
cso_save_framebuffer(ctx->cso);
|
||||
cso_save_fragment_shader(ctx->cso);
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
@@ -1572,7 +1573,7 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
cso_single_sampler(ctx->cso, 0, &ctx->sampler);
|
||||
cso_single_sampler_done(ctx->cso);
|
||||
|
||||
cso_set_sampler_textures(ctx->cso, 1, &pt);
|
||||
cso_set_fragment_sampler_views(ctx->cso, 1, &psv);
|
||||
|
||||
/* quad coords in clip coords */
|
||||
offset = set_vertex_data(ctx,
|
||||
@@ -1597,7 +1598,7 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
cso_restore_depth_stencil_alpha(ctx->cso);
|
||||
cso_restore_rasterizer(ctx->cso);
|
||||
cso_restore_samplers(ctx->cso);
|
||||
cso_restore_sampler_textures(ctx->cso);
|
||||
cso_restore_fragment_sampler_views(ctx->cso);
|
||||
cso_restore_framebuffer(ctx->cso);
|
||||
cso_restore_fragment_shader(ctx->cso);
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
|
||||
@@ -59,7 +59,7 @@ util_gen_mipmap_flush( struct gen_mipmap_state *ctx );
|
||||
|
||||
extern void
|
||||
util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
struct pipe_texture *pt,
|
||||
struct pipe_sampler_view *psv,
|
||||
uint face, uint baseLevel, uint lastLevel, uint filter);
|
||||
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
#include "util/u_blit.h"
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "util/u_sampler.h"
|
||||
#include "util/u_math.h"
|
||||
|
||||
|
||||
@@ -380,6 +381,8 @@ compress_with_blit(GLcontext * ctx,
|
||||
gl_format mesa_format;
|
||||
struct pipe_texture templ;
|
||||
struct pipe_texture *src_tex;
|
||||
struct pipe_sampler_view view_templ;
|
||||
struct pipe_sampler_view *src_view;
|
||||
struct pipe_surface *dst_surface;
|
||||
struct pipe_transfer *tex_xfer;
|
||||
void *map;
|
||||
@@ -441,9 +444,16 @@ compress_with_blit(GLcontext * ctx,
|
||||
pipe->transfer_unmap(pipe, tex_xfer);
|
||||
pipe->tex_transfer_destroy(pipe, tex_xfer);
|
||||
|
||||
/* Create temporary sampler view */
|
||||
u_sampler_view_default_template(&view_templ,
|
||||
src_tex,
|
||||
src_tex->format);
|
||||
src_view = pipe->create_sampler_view(pipe, src_tex, &view_templ);
|
||||
|
||||
|
||||
/* copy / compress image */
|
||||
util_blit_pixels_tex(ctx->st->blit,
|
||||
src_tex, /* pipe_texture (src) */
|
||||
src_view, /* sampler view (src) */
|
||||
0, 0, /* src x0, y0 */
|
||||
width, height, /* src x1, y1 */
|
||||
dst_surface, /* pipe_surface (dst) */
|
||||
@@ -455,6 +465,7 @@ compress_with_blit(GLcontext * ctx,
|
||||
|
||||
pipe_surface_reference(&dst_surface, NULL);
|
||||
pipe_texture_reference(&src_tex, NULL);
|
||||
pipe_sampler_view_reference(&src_view, NULL);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
@@ -817,6 +828,8 @@ decompress_with_blit(GLcontext * ctx, GLenum target, GLint level,
|
||||
struct pipe_context *pipe = ctx->st->pipe;
|
||||
struct pipe_screen *screen = pipe->screen;
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
struct pipe_sampler_view *src_view = st_get_stobj_sampler_view(stObj);
|
||||
const GLuint width = texImage->Width;
|
||||
const GLuint height = texImage->Height;
|
||||
struct pipe_surface *dst_surface;
|
||||
@@ -833,7 +846,7 @@ decompress_with_blit(GLcontext * ctx, GLenum target, GLint level,
|
||||
|
||||
/* blit/render/decompress */
|
||||
util_blit_pixels_tex(ctx->st->blit,
|
||||
stImage->pt, /* pipe_texture (src) */
|
||||
src_view, /* pipe_texture (src) */
|
||||
0, 0, /* src x0, y0 */
|
||||
width, height, /* src x1, y1 */
|
||||
dst_surface, /* pipe_surface (dst) */
|
||||
@@ -1457,7 +1470,6 @@ st_copy_texsubimage(GLcontext *ctx,
|
||||
&ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
struct gl_texture_object *texObj =
|
||||
_mesa_select_tex_object(ctx, texUnit, target);
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
struct gl_texture_image *texImage =
|
||||
_mesa_select_tex_image(ctx, texObj, target, level);
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
|
||||
@@ -79,22 +79,23 @@ st_destroy_generate_mipmap(struct st_context *st)
|
||||
static boolean
|
||||
st_render_mipmap(struct st_context *st,
|
||||
GLenum target,
|
||||
struct pipe_texture *pt,
|
||||
struct st_texture_object *stObj,
|
||||
uint baseLevel, uint lastLevel)
|
||||
{
|
||||
struct pipe_context *pipe = st->pipe;
|
||||
struct pipe_screen *screen = pipe->screen;
|
||||
struct pipe_sampler_view *psv = st_get_stobj_sampler_view(stObj);
|
||||
const uint face = _mesa_tex_target_to_face(target);
|
||||
|
||||
assert(target != GL_TEXTURE_3D); /* not done yet */
|
||||
|
||||
/* check if we can render in the texture's format */
|
||||
if (!screen->is_format_supported(screen, pt->format, pt->target,
|
||||
if (!screen->is_format_supported(screen, psv->format, psv->texture->target,
|
||||
PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
util_gen_mipmap(st->gen_mipmap, pt, face, baseLevel, lastLevel,
|
||||
util_gen_mipmap(st->gen_mipmap, psv, face, baseLevel, lastLevel,
|
||||
PIPE_TEX_FILTER_LINEAR);
|
||||
|
||||
return TRUE;
|
||||
@@ -211,6 +212,7 @@ st_generate_mipmap(GLcontext *ctx, GLenum target,
|
||||
struct gl_texture_object *texObj)
|
||||
{
|
||||
struct st_context *st = ctx->st;
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
struct pipe_texture *pt = st_get_texobj_texture(texObj);
|
||||
const uint baseLevel = texObj->BaseLevel;
|
||||
uint lastLevel;
|
||||
@@ -229,7 +231,6 @@ st_generate_mipmap(GLcontext *ctx, GLenum target,
|
||||
/* The current gallium texture doesn't have space for all the
|
||||
* mipmap levels we need to generate. So allocate a new texture.
|
||||
*/
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
struct pipe_texture *oldTex = stObj->pt;
|
||||
GLboolean needFlush;
|
||||
|
||||
@@ -264,7 +265,7 @@ st_generate_mipmap(GLcontext *ctx, GLenum target,
|
||||
/* Recall that the Mesa BaseLevel image is stored in the gallium
|
||||
* texture's level[0] position. So pass baseLevel=0 here.
|
||||
*/
|
||||
if (!st_render_mipmap(st, target, pt, 0, lastLevel)) {
|
||||
if (!st_render_mipmap(st, target, stObj, 0, lastLevel)) {
|
||||
fallback_generate_mipmap(ctx, target, texObj);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user