mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
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:
parent
e1a4bb2370
commit
ac8662c29d
6 changed files with 78 additions and 23 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue