gallium: turn on clipping for bitmaps
Bitmaps can extend beyond window edges so we need to clip. Also, move some state atom vars to st_context to be a bit more efficient.
This commit is contained in:
@@ -350,16 +350,21 @@ setup_bitmap_vertex_data(struct st_context *st,
|
|||||||
{
|
{
|
||||||
struct pipe_context *pipe = st->pipe;
|
struct pipe_context *pipe = st->pipe;
|
||||||
const struct gl_framebuffer *fb = st->ctx->DrawBuffer;
|
const struct gl_framebuffer *fb = st->ctx->DrawBuffer;
|
||||||
const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP);
|
const GLfloat fb_width = fb->Width;
|
||||||
|
const GLfloat fb_height = fb->Height;
|
||||||
const GLfloat x0 = x;
|
const GLfloat x0 = x;
|
||||||
const GLfloat x1 = x + width;
|
const GLfloat x1 = x + width;
|
||||||
const GLfloat y0 = invert ? ((int) fb->Height - y - height) : y;
|
const GLfloat y0 = y;
|
||||||
const GLfloat y1 = invert ? (y0 + height) : y + height;
|
const GLfloat y1 = y + height;
|
||||||
const GLfloat bias = st->bitmap_texcoord_bias;
|
const GLfloat bias = st->bitmap_texcoord_bias;
|
||||||
const GLfloat xBias = bias / (x1-x0);
|
const GLfloat xBias = bias / (x1-x0);
|
||||||
const GLfloat yBias = bias / (y1-y0);
|
const GLfloat yBias = bias / (y1-y0);
|
||||||
const GLfloat sLeft = 0.0 + xBias, sRight = 1.0 + xBias;
|
const GLfloat sLeft = 0.0 + xBias, sRight = 1.0 + xBias;
|
||||||
const GLfloat tTop = 1.0 - yBias, tBot = 1.0 - tTop - yBias;
|
const GLfloat tTop = yBias, tBot = 1.0 - tTop - yBias;
|
||||||
|
const GLfloat clip_x0 = x0 / fb_width * 2.0 - 1.0;
|
||||||
|
const GLfloat clip_y0 = y0 / fb_height * 2.0 - 1.0;
|
||||||
|
const GLfloat clip_x1 = x1 / fb_width * 2.0 - 1.0;
|
||||||
|
const GLfloat clip_y1 = y1 / fb_height * 2.0 - 1.0;
|
||||||
GLuint i;
|
GLuint i;
|
||||||
void *buf;
|
void *buf;
|
||||||
|
|
||||||
@@ -369,24 +374,26 @@ setup_bitmap_vertex_data(struct st_context *st,
|
|||||||
sizeof(st->bitmap.vertices));
|
sizeof(st->bitmap.vertices));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* positions, texcoords */
|
/* Positions are in clip coords since we need to do clipping in case
|
||||||
st->bitmap.vertices[0][0][0] = x0;
|
* the bitmap quad goes beyond the window bounds.
|
||||||
st->bitmap.vertices[0][0][1] = y0;
|
*/
|
||||||
|
st->bitmap.vertices[0][0][0] = clip_x0;
|
||||||
|
st->bitmap.vertices[0][0][1] = clip_y0;
|
||||||
st->bitmap.vertices[0][2][0] = sLeft;
|
st->bitmap.vertices[0][2][0] = sLeft;
|
||||||
st->bitmap.vertices[0][2][1] = tTop;
|
st->bitmap.vertices[0][2][1] = tTop;
|
||||||
|
|
||||||
st->bitmap.vertices[1][0][0] = x1;
|
st->bitmap.vertices[1][0][0] = clip_x1;
|
||||||
st->bitmap.vertices[1][0][1] = y0;
|
st->bitmap.vertices[1][0][1] = clip_y0;
|
||||||
st->bitmap.vertices[1][2][0] = sRight;
|
st->bitmap.vertices[1][2][0] = sRight;
|
||||||
st->bitmap.vertices[1][2][1] = tTop;
|
st->bitmap.vertices[1][2][1] = tTop;
|
||||||
|
|
||||||
st->bitmap.vertices[2][0][0] = x1;
|
st->bitmap.vertices[2][0][0] = clip_x1;
|
||||||
st->bitmap.vertices[2][0][1] = y1;
|
st->bitmap.vertices[2][0][1] = clip_y1;
|
||||||
st->bitmap.vertices[2][2][0] = sRight;
|
st->bitmap.vertices[2][2][0] = sRight;
|
||||||
st->bitmap.vertices[2][2][1] = tBot;
|
st->bitmap.vertices[2][2][1] = tBot;
|
||||||
|
|
||||||
st->bitmap.vertices[3][0][0] = x0;
|
st->bitmap.vertices[3][0][0] = clip_x0;
|
||||||
st->bitmap.vertices[3][0][1] = y1;
|
st->bitmap.vertices[3][0][1] = clip_y1;
|
||||||
st->bitmap.vertices[3][2][0] = sLeft;
|
st->bitmap.vertices[3][2][0] = sLeft;
|
||||||
st->bitmap.vertices[3][2][1] = tBot;
|
st->bitmap.vertices[3][2][1] = tBot;
|
||||||
|
|
||||||
@@ -437,17 +444,11 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
|
|||||||
|
|
||||||
cso_save_rasterizer(cso);
|
cso_save_rasterizer(cso);
|
||||||
cso_save_samplers(cso);
|
cso_save_samplers(cso);
|
||||||
|
cso_save_viewport(cso);
|
||||||
|
|
||||||
/* rasterizer state: just scissor */
|
/* rasterizer state: just scissor */
|
||||||
{
|
st->bitmap.rasterizer.scissor = ctx->Scissor.Enabled;
|
||||||
struct pipe_rasterizer_state rasterizer;
|
cso_set_rasterizer(cso, &st->bitmap.rasterizer);
|
||||||
memset(&rasterizer, 0, sizeof(rasterizer));
|
|
||||||
if (ctx->Scissor.Enabled)
|
|
||||||
rasterizer.scissor = 1;
|
|
||||||
rasterizer.bypass_clipping = 1;
|
|
||||||
|
|
||||||
cso_set_rasterizer(cso, &rasterizer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fragment shader state: TEX lookup program */
|
/* fragment shader state: TEX lookup program */
|
||||||
pipe->bind_fs_state(pipe, stfp->driver_shader);
|
pipe->bind_fs_state(pipe, stfp->driver_shader);
|
||||||
@@ -456,21 +457,26 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
|
|||||||
pipe->bind_vs_state(pipe, st->bitmap.vs);
|
pipe->bind_vs_state(pipe, st->bitmap.vs);
|
||||||
|
|
||||||
/* sampler / texture state */
|
/* sampler / texture state */
|
||||||
|
cso_single_sampler(cso, 0, &st->bitmap.sampler);
|
||||||
|
cso_single_sampler_done(cso);
|
||||||
|
pipe->set_sampler_textures(pipe, 1, &pt);
|
||||||
|
|
||||||
|
/* viewport state: viewport matching window dims */
|
||||||
{
|
{
|
||||||
struct pipe_sampler_state sampler;
|
const struct gl_framebuffer *fb = st->ctx->DrawBuffer;
|
||||||
memset(&sampler, 0, sizeof(sampler));
|
const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP);
|
||||||
sampler.wrap_s = PIPE_TEX_WRAP_CLAMP;
|
const float width = fb->Width;
|
||||||
sampler.wrap_t = PIPE_TEX_WRAP_CLAMP;
|
const float height = fb->Height;
|
||||||
sampler.wrap_r = PIPE_TEX_WRAP_CLAMP;
|
struct pipe_viewport_state vp;
|
||||||
sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
|
vp.scale[0] = 0.5 * width;
|
||||||
sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
|
vp.scale[1] = height * (invert ? -0.5 : 0.5);
|
||||||
sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
|
vp.scale[2] = 1.0;
|
||||||
sampler.normalized_coords = 1;
|
vp.scale[3] = 1.0;
|
||||||
|
vp.translate[0] = 0.5 * width;
|
||||||
cso_single_sampler(cso, 0, &sampler);
|
vp.translate[1] = 0.5 * height;
|
||||||
cso_single_sampler_done(cso);
|
vp.translate[2] = 0.0;
|
||||||
|
vp.translate[3] = 0.0;
|
||||||
pipe->set_sampler_textures(pipe, 1, &pt);
|
cso_set_viewport(cso, &vp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw textured quad */
|
/* draw textured quad */
|
||||||
@@ -487,6 +493,7 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
|
|||||||
/* restore state */
|
/* restore state */
|
||||||
cso_restore_rasterizer(cso);
|
cso_restore_rasterizer(cso);
|
||||||
cso_restore_samplers(cso);
|
cso_restore_samplers(cso);
|
||||||
|
cso_restore_viewport(cso);
|
||||||
/* shaders don't go through cso yet */
|
/* shaders don't go through cso yet */
|
||||||
pipe->bind_fs_state(pipe, st->fp->driver_shader);
|
pipe->bind_fs_state(pipe, st->fp->driver_shader);
|
||||||
pipe->bind_vs_state(pipe, st->vp->driver_shader);
|
pipe->bind_vs_state(pipe, st->vp->driver_shader);
|
||||||
@@ -742,6 +749,21 @@ st_init_bitmap_functions(struct dd_function_table *functions)
|
|||||||
void
|
void
|
||||||
st_init_bitmap(struct st_context *st)
|
st_init_bitmap(struct st_context *st)
|
||||||
{
|
{
|
||||||
|
struct pipe_sampler_state *sampler = &st->bitmap.sampler;
|
||||||
|
|
||||||
|
/* init sampler state once */
|
||||||
|
memset(sampler, 0, sizeof(*sampler));
|
||||||
|
sampler->wrap_s = PIPE_TEX_WRAP_CLAMP;
|
||||||
|
sampler->wrap_t = PIPE_TEX_WRAP_CLAMP;
|
||||||
|
sampler->wrap_r = PIPE_TEX_WRAP_CLAMP;
|
||||||
|
sampler->min_img_filter = PIPE_TEX_FILTER_NEAREST;
|
||||||
|
sampler->min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
|
||||||
|
sampler->mag_img_filter = PIPE_TEX_FILTER_NEAREST;
|
||||||
|
sampler->normalized_coords = 1;
|
||||||
|
|
||||||
|
/* init scissor state once */
|
||||||
|
memset(&st->bitmap.rasterizer, 0, sizeof(st->bitmap.rasterizer));
|
||||||
|
|
||||||
init_bitmap_cache(st);
|
init_bitmap_cache(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -148,6 +148,8 @@ struct st_context
|
|||||||
struct st_fragment_program *program; /**< bitmap tex/kil program */
|
struct st_fragment_program *program; /**< bitmap tex/kil program */
|
||||||
GLuint user_prog_sn; /**< user fragment program serial no. */
|
GLuint user_prog_sn; /**< user fragment program serial no. */
|
||||||
struct st_fragment_program *combined_prog;
|
struct st_fragment_program *combined_prog;
|
||||||
|
struct pipe_rasterizer_state rasterizer;
|
||||||
|
struct pipe_sampler_state sampler;
|
||||||
struct pipe_shader_state vert_shader;
|
struct pipe_shader_state vert_shader;
|
||||||
void *vs;
|
void *vs;
|
||||||
float vertices[4][3][4]; /**< vertex pos + color + texcoord */
|
float vertices[4][3][4]; /**< vertex pos + color + texcoord */
|
||||||
|
Reference in New Issue
Block a user