glamor: xv: prepare to one-plane formats

As a preparation to one-plane formats (for example, UYVY), second
texture definition is moved inside a format switch, and all allocations
now also done inside a texture switch.
No functional change.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Konstantin <ria.freelander@gmail.com>
This commit is contained in:
Konstantin 2023-10-20 22:51:55 +03:00
parent 81ef43dd4a
commit ffd7151b10

View File

@ -165,18 +165,22 @@ glamor_init_xv_shader(ScreenPtr screen, glamor_port_private *port_priv, int id)
glamor_facet_xv_planar, NULL, NULL, NULL);
glUseProgram(port_priv->xv_prog.prog);
sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "y_sampler");
glUniform1i(sampler_loc, 0);
sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "u_sampler");
glUniform1i(sampler_loc, 1);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "v_sampler");
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "y_sampler");
glUniform1i(sampler_loc, 0);
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "u_sampler");
glUniform1i(sampler_loc, 1);
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "v_sampler");
glUniform1i(sampler_loc, 2);
break;
case FOURCC_NV12:
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "y_sampler");
glUniform1i(sampler_loc, 0);
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "u_sampler");
glUniform1i(sampler_loc, 1);
break;
default:
break;
@ -380,6 +384,9 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->fbo->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@ -387,9 +394,6 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->fbo->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@ -398,6 +402,12 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
break;
case FOURCC_NV12:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->fbo->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
break;
default:
break;
@ -532,28 +542,34 @@ glamor_xv_put_image(glamor_port_private *port_priv,
if (port_priv->src_pix[i])
glamor_destroy_pixmap(port_priv->src_pix[i]);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 8,
GLAMOR_CREATE_FBO_NO_FBO);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
port_priv->src_pix[1] =
glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8,
GLAMOR_CREATE_FBO_NO_FBO);
port_priv->src_pix[2] =
glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8,
GLAMOR_CREATE_FBO_NO_FBO);
if (!port_priv->src_pix[2])
if (!port_priv->src_pix[1] || !port_priv->src_pix[2])
return BadAlloc;
break;
case FOURCC_NV12:
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 8,
GLAMOR_CREATE_FBO_NO_FBO);
port_priv->src_pix[1] =
glamor_create_pixmap(pScreen, width >> 1, height >> 1, 16,
GLAMOR_CREATE_FBO_NO_FBO |
GLAMOR_CREATE_FORMAT_CBCR);
port_priv->src_pix[2] = NULL;
if (!port_priv->src_pix[1])
return BadAlloc;
break;
default:
return BadMatch;
@ -562,7 +578,7 @@ glamor_xv_put_image(glamor_port_private *port_priv,
port_priv->src_pix_w = width;
port_priv->src_pix_h = height;
if (!port_priv->src_pix[0] || !port_priv->src_pix[1])
if (!port_priv->src_pix[0])
return BadAlloc;
}