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); glamor_facet_xv_planar, NULL, NULL, NULL);
glUseProgram(port_priv->xv_prog.prog); 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) { switch (id) {
case FOURCC_YV12: case FOURCC_YV12:
case FOURCC_I420: 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); glUniform1i(sampler_loc, 2);
break; break;
case FOURCC_NV12: 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; break;
default: default:
break; break;
@ -380,16 +384,16 @@ 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_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
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);
switch (id) { switch (id) {
case FOURCC_YV12: case FOURCC_YV12:
case FOURCC_I420: 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);
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);
glActiveTexture(GL_TEXTURE2); glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->fbo->tex); glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->fbo->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 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); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
break; break;
case FOURCC_NV12: 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; break;
default: default:
break; break;
@ -532,28 +542,34 @@ glamor_xv_put_image(glamor_port_private *port_priv,
if (port_priv->src_pix[i]) if (port_priv->src_pix[i])
glamor_destroy_pixmap(port_priv->src_pix[i]); glamor_destroy_pixmap(port_priv->src_pix[i]);
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 8,
GLAMOR_CREATE_FBO_NO_FBO);
switch (id) { switch (id) {
case FOURCC_YV12: case FOURCC_YV12:
case FOURCC_I420: case FOURCC_I420:
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 8,
GLAMOR_CREATE_FBO_NO_FBO);
port_priv->src_pix[1] = port_priv->src_pix[1] =
glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8,
GLAMOR_CREATE_FBO_NO_FBO); GLAMOR_CREATE_FBO_NO_FBO);
port_priv->src_pix[2] = port_priv->src_pix[2] =
glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8,
GLAMOR_CREATE_FBO_NO_FBO); GLAMOR_CREATE_FBO_NO_FBO);
if (!port_priv->src_pix[2]) if (!port_priv->src_pix[1] || !port_priv->src_pix[2])
return BadAlloc; return BadAlloc;
break; break;
case FOURCC_NV12: 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] = port_priv->src_pix[1] =
glamor_create_pixmap(pScreen, width >> 1, height >> 1, 16, glamor_create_pixmap(pScreen, width >> 1, height >> 1, 16,
GLAMOR_CREATE_FBO_NO_FBO | GLAMOR_CREATE_FBO_NO_FBO |
GLAMOR_CREATE_FORMAT_CBCR); GLAMOR_CREATE_FORMAT_CBCR);
port_priv->src_pix[2] = NULL; port_priv->src_pix[2] = NULL;
if (!port_priv->src_pix[1])
return BadAlloc;
break; break;
default: default:
return BadMatch; 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_w = width;
port_priv->src_pix_h = height; 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; return BadAlloc;
} }