st/xorg: fix up xorg state tracker to use cso changes

use cso_set_fragment_sampler_views instead of cso_set_sampler_textures
This commit is contained in:
Roland Scheidegger 2010-03-16 15:49:23 +01:00
parent e1a4bb2370
commit ac8662c29d
6 changed files with 78 additions and 23 deletions

View file

@ -4,6 +4,7 @@
#include "xorg_exa_tgsi.h"
#include "cso_cache/cso_context.h"
#include "util/u_sampler.h"
/*XXX also in Xrender.h but the including it here breaks compilition */
@ -356,6 +357,9 @@ bind_samplers(struct exa_context *exa, int op,
{
struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
struct pipe_sampler_state src_sampler, mask_sampler;
struct pipe_sampler_view view_templ;
struct pipe_sampler_view *src_view;
struct pipe_context *pipe = exa->pipe;
exa->num_bound_samplers = 0;
@ -366,7 +370,7 @@ bind_samplers(struct exa_context *exa, int op,
if (exa->has_solid_color) {
debug_assert(!"solid color with textures");
samplers[0] = NULL;
exa->bound_textures[0] = NULL;
pipe_sampler_view_reference(&exa->bound_sampler_views[0], NULL);
} else {
unsigned src_wrap = render_repeat_to_gallium(
pSrcPicture->repeatType);
@ -381,8 +385,13 @@ bind_samplers(struct exa_context *exa, int op,
src_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;
src_sampler.normalized_coords = 1;
samplers[0] = &src_sampler;
exa->bound_textures[0] = pSrc->tex;
exa->num_bound_samplers = 1;
u_sampler_view_default_template(&view_templ,
pSrc->tex,
pSrc->tex->format);
src_view = pipe->create_sampler_view(pipe, pSrc->tex, &view_templ);
pipe_sampler_view_reference(&exa->bound_sampler_views[0], NULL);
exa->bound_sampler_views[0] = src_view;
}
}
@ -400,14 +409,19 @@ bind_samplers(struct exa_context *exa, int op,
src_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;
mask_sampler.normalized_coords = 1;
samplers[1] = &mask_sampler;
exa->bound_textures[1] = pMask->tex;
exa->num_bound_samplers = 2;
u_sampler_view_default_template(&view_templ,
pMask->tex,
pMask->tex->format);
src_view = pipe->create_sampler_view(pipe, pMask->tex, &view_templ);
pipe_sampler_view_reference(&exa->bound_sampler_views[1], NULL);
exa->bound_sampler_views[1] = src_view;
}
cso_set_samplers(exa->renderer->cso, exa->num_bound_samplers,
(const struct pipe_sampler_state **)samplers);
cso_set_sampler_textures(exa->renderer->cso, exa->num_bound_samplers,
exa->bound_textures);
cso_set_fragment_sampler_views(exa->renderer->cso, exa->num_bound_samplers,
exa->bound_sampler_views);
}
@ -476,7 +490,6 @@ boolean xorg_composite_bind_state(struct exa_context *exa,
renderer_begin_solid(exa->renderer);
} else {
renderer_begin_textures(exa->renderer,
exa->bound_textures,
exa->num_bound_samplers);
}
@ -506,7 +519,7 @@ void xorg_composite(struct exa_context *exa,
renderer_texture(exa->renderer,
pos, width, height,
exa->bound_textures,
exa->bound_sampler_views,
exa->num_bound_samplers,
src_matrix, mask_matrix);
}
@ -538,7 +551,7 @@ boolean xorg_solid_bind_state(struct exa_context *exa,
pixmap->width, pixmap->height);
bind_blend_state(exa, PictOpSrc, NULL, NULL, NULL);
cso_set_samplers(exa->renderer->cso, 0, NULL);
cso_set_sampler_textures(exa->renderer->cso, 0, NULL);
cso_set_fragment_sampler_views(exa->renderer->cso, 0, NULL);
shader = xorg_shaders_get(exa->renderer->shaders, vs_traits, fs_traits);
cso_set_vertex_shader_handle(exa->renderer->cso, shader.vs);

View file

@ -975,6 +975,9 @@ xorg_exa_close(ScrnInfoPtr pScrn)
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_context *exa = ms->exa;
pipe_sampler_view_reference(&exa->bound_sampler_views[0], NULL);
pipe_sampler_view_reference(&exa->bound_sampler_views[1], NULL);
renderer_destroy(exa->renderer);
if (exa->pipe)

View file

@ -18,7 +18,7 @@ struct exa_context
struct pipe_screen *scrn;
struct xorg_renderer *renderer;
struct pipe_texture *bound_textures[MAX_EXA_SAMPLERS];
struct pipe_sampler_view *bound_sampler_views[MAX_EXA_SAMPLERS];
int num_bound_samplers;
float solid_color[4];

View file

@ -8,6 +8,7 @@
#include "util/u_math.h"
#include "util/u_memory.h"
#include "util/u_rect.h"
#include "util/u_sampler.h"
#include "util/u_inlines.h"
@ -482,8 +483,17 @@ void renderer_copy_prepare(struct xorg_renderer *r,
dst_surface->width,
dst_surface->height);
/* texture */
cso_set_sampler_textures(r->cso, 1, &src_texture);
/* texture/sampler view */
{
struct pipe_sampler_view templ;
struct pipe_sampler_view *src_view;
u_sampler_view_default_template(&templ,
src_texture,
src_texture->format);
src_view = pipe->create_sampler_view(pipe, src_texture, &templ);
cso_set_fragment_sampler_views(r->cso, 1, &src_view);
pipe_sampler_view_reference(&src_view, NULL);
}
/* shaders */
shader = xorg_shaders_get(r->shaders,
@ -655,7 +665,6 @@ void renderer_draw_flush(struct xorg_renderer *r)
}
void renderer_begin_textures(struct xorg_renderer *r,
struct pipe_texture **textures,
int num_textures)
{
r->attrs_per_vertex = 1 + num_textures;
@ -665,7 +674,7 @@ void renderer_begin_textures(struct xorg_renderer *r,
void renderer_texture(struct xorg_renderer *r,
int *pos,
int width, int height,
struct pipe_texture **textures,
struct pipe_sampler_view **sampler_view,
int num_textures,
float *src_matrix,
float *mask_matrix)
@ -693,7 +702,7 @@ void renderer_texture(struct xorg_renderer *r,
pos[0], pos[1], /* src */
pos[4], pos[5], /* dst */
width, height,
textures[0], src_matrix);
sampler_view[0]->texture, src_matrix);
break;
case 3:
renderer_draw_conditional(r, 4 * 12);
@ -702,7 +711,7 @@ void renderer_texture(struct xorg_renderer *r,
pos[2], pos[3], /* mask */
pos[4], pos[5], /* dst */
width, height,
textures[0], textures[1],
sampler_view[0]->texture, sampler_view[1]->texture,
src_matrix, mask_matrix);
break;
default:

View file

@ -65,12 +65,12 @@ void renderer_solid(struct xorg_renderer *r,
float *color);
void renderer_begin_textures(struct xorg_renderer *r,
struct pipe_texture **textures,
int num_textures);
void renderer_texture(struct xorg_renderer *r,
int *pos,
int width, int height,
struct pipe_texture **textures,
struct pipe_sampler_view **textures,
int num_textures,
float *src_matrix,
float *mask_matrix);

View file

@ -9,6 +9,7 @@
#include "xorg_exa_tgsi.h"
#include "cso_cache/cso_context.h"
#include "util/u_sampler.h"
#include "pipe/p_screen.h"
@ -91,6 +92,7 @@ struct xorg_xv_port_priv {
/* juggle two sets of seperate Y, U and V
* textures */
struct pipe_texture *yuv[2][3];
struct pipe_sampler_view *yuv_views[2][3];
};
@ -180,32 +182,60 @@ static int
check_yuv_textures(struct xorg_xv_port_priv *priv, int width, int height)
{
struct pipe_texture **dst = priv->yuv[priv->current_set];
struct pipe_sampler_view **dst_view = priv->yuv_views[priv->current_set];
struct pipe_sampler_view view_templ;
struct pipe_context *pipe = priv->r->pipe;
if (!dst[0] ||
dst[0]->width0 != width ||
dst[0]->height0 != height) {
pipe_texture_reference(&dst[0], NULL);
pipe_sampler_view_reference(&dst_view[0], NULL);
}
if (!dst[1] ||
dst[1]->width0 != width ||
dst[1]->height0 != height) {
pipe_texture_reference(&dst[1], NULL);
pipe_sampler_view_reference(&dst_view[1], NULL);
}
if (!dst[2] ||
dst[2]->width0 != width ||
dst[2]->height0 != height) {
pipe_texture_reference(&dst[2], NULL);
pipe_sampler_view_reference(&dst_view[2], NULL);
}
if (!dst[0])
if (!dst[0]) {
dst[0] = create_component_texture(priv->r->pipe, width, height);
if (dst[0]) {
u_sampler_view_default_template(&view_templ,
dst[0],
dst[0]->format);
dst_view[0] = pipe->create_sampler_view(pipe, dst[0], &view_templ);
}
}
if (!dst[1])
if (!dst[1]) {
dst[1] = create_component_texture(priv->r->pipe, width, height);
if (dst[1]) {
u_sampler_view_default_template(&view_templ,
dst[1],
dst[1]->format);
dst_view[1] = pipe->create_sampler_view(pipe, dst[1], &view_templ);
}
}
if (!dst[2])
if (!dst[2]) {
dst[2] = create_component_texture(priv->r->pipe, width, height);
if (dst[2]) {
u_sampler_view_default_template(&view_templ,
dst[2],
dst[2]->format);
dst_view[2] = pipe->create_sampler_view(pipe, dst[2], &view_templ);
}
}
if (!dst[0] || !dst[1] || !dst[2])
if (!dst[0] || !dst[1] || !dst[2] || !dst_view[0] || !dst_view[1] || !dst_view[2] )
return BadAlloc;
return Success;
@ -450,6 +480,7 @@ bind_samplers(struct xorg_xv_port_priv *port)
struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
struct pipe_sampler_state sampler;
struct pipe_texture **dst = port->yuv[port->current_set];
struct pipe_sampler_view **dst_views = port->yuv_views[port->current_set];
memset(&sampler, 0, sizeof(struct pipe_sampler_state));
@ -469,8 +500,7 @@ bind_samplers(struct xorg_xv_port_priv *port)
cso_set_samplers(port->r->cso, 3,
(const struct pipe_sampler_state **)samplers);
cso_set_sampler_textures(port->r->cso, 3,
dst);
cso_set_fragment_sampler_views(port->r->cso, 3, dst_views);
}
static int