mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 20:38:06 +02:00
gallium: util_blit_pixels() takes source sampler view as argument.
This commit is contained in:
parent
dbf20a1f0f
commit
f2bc089d14
4 changed files with 36 additions and 11 deletions
|
|
@ -45,6 +45,7 @@
|
|||
#include "util/u_format.h"
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_sampler.h"
|
||||
#include "util/u_simple_shaders.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "util/u_rect.h"
|
||||
|
|
@ -280,6 +281,7 @@ regions_overlap(int srcX0, int srcY0,
|
|||
void
|
||||
util_blit_pixels_writemask(struct blit_state *ctx,
|
||||
struct pipe_surface *src,
|
||||
struct pipe_sampler_view *src_sampler_view,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
|
|
@ -291,6 +293,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
struct pipe_context *pipe = ctx->pipe;
|
||||
struct pipe_screen *screen = pipe->screen;
|
||||
struct pipe_texture *tex = NULL;
|
||||
struct pipe_sampler_view *sampler_view = NULL;
|
||||
struct pipe_framebuffer_state fb;
|
||||
const int srcW = abs(srcX1 - srcX0);
|
||||
const int srcH = abs(srcY1 - srcY0);
|
||||
|
|
@ -345,6 +348,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
src->texture->last_level != 0)
|
||||
{
|
||||
struct pipe_texture texTemp;
|
||||
struct pipe_sampler_view sv_templ;
|
||||
struct pipe_surface *texSurf;
|
||||
const int srcLeft = MIN2(srcX0, srcX1);
|
||||
const int srcTop = MIN2(srcY0, srcY1);
|
||||
|
|
@ -376,6 +380,14 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
if (!tex)
|
||||
return;
|
||||
|
||||
u_sampler_view_default_template(&sv_templ, tex, tex->format);
|
||||
|
||||
sampler_view = ctx->pipe->create_sampler_view(ctx->pipe, tex, &sv_templ);
|
||||
if (!sampler_view) {
|
||||
pipe_texture_reference(&tex, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
texSurf = screen->get_tex_surface(screen, tex, 0, 0, 0,
|
||||
PIPE_BUFFER_USAGE_GPU_WRITE);
|
||||
|
||||
|
|
@ -399,22 +411,25 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
s1 = 1.0f;
|
||||
t0 = 0.0f;
|
||||
t1 = 1.0f;
|
||||
|
||||
pipe_texture_reference(&tex, NULL);
|
||||
}
|
||||
else {
|
||||
pipe_texture_reference(&tex, src->texture);
|
||||
pipe_sampler_view_reference(&sampler_view, src_sampler_view);
|
||||
s0 = srcX0 / (float)tex->width0;
|
||||
s1 = srcX1 / (float)tex->width0;
|
||||
t0 = srcY0 / (float)tex->height0;
|
||||
t1 = srcY1 / (float)tex->height0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* save state (restored below) */
|
||||
cso_save_blend(ctx->cso);
|
||||
cso_save_depth_stencil_alpha(ctx->cso);
|
||||
cso_save_rasterizer(ctx->cso);
|
||||
cso_save_samplers(ctx->cso);
|
||||
cso_save_sampler_textures(ctx->cso);
|
||||
cso_save_fragment_sampler_views(ctx->cso);
|
||||
cso_save_viewport(ctx->cso);
|
||||
cso_save_framebuffer(ctx->cso);
|
||||
cso_save_fragment_shader(ctx->cso);
|
||||
|
|
@ -447,7 +462,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
cso_set_viewport(ctx->cso, &ctx->viewport);
|
||||
|
||||
/* texture */
|
||||
cso_set_sampler_textures(ctx->cso, 1, &tex);
|
||||
cso_set_fragment_sampler_views(ctx->cso, 1, &sampler_view);
|
||||
|
||||
if (ctx->fs[writemask] == NULL)
|
||||
ctx->fs[writemask] =
|
||||
|
|
@ -486,7 +501,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
cso_restore_depth_stencil_alpha(ctx->cso);
|
||||
cso_restore_rasterizer(ctx->cso);
|
||||
cso_restore_samplers(ctx->cso);
|
||||
cso_restore_sampler_textures(ctx->cso);
|
||||
cso_restore_fragment_sampler_views(ctx->cso);
|
||||
cso_restore_viewport(ctx->cso);
|
||||
cso_restore_framebuffer(ctx->cso);
|
||||
cso_restore_fragment_shader(ctx->cso);
|
||||
|
|
@ -494,13 +509,14 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
cso_restore_clip(ctx->cso);
|
||||
cso_restore_vertex_elements(ctx->cso);
|
||||
|
||||
pipe_texture_reference(&tex, NULL);
|
||||
pipe_sampler_view_reference(&sampler_view, NULL);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
util_blit_pixels(struct blit_state *ctx,
|
||||
struct pipe_surface *src,
|
||||
struct pipe_sampler_view *src_sampler_view,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
|
|
@ -508,7 +524,7 @@ util_blit_pixels(struct blit_state *ctx,
|
|||
int dstX1, int dstY1,
|
||||
float z, uint filter )
|
||||
{
|
||||
util_blit_pixels_writemask( ctx, src,
|
||||
util_blit_pixels_writemask( ctx, src, src_sampler_view,
|
||||
srcX0, srcY0,
|
||||
srcX1, srcY1,
|
||||
dst,
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ util_destroy_blit(struct blit_state *ctx);
|
|||
extern void
|
||||
util_blit_pixels(struct blit_state *ctx,
|
||||
struct pipe_surface *src,
|
||||
struct pipe_sampler_view *src_sampler_view,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
|
|
@ -63,6 +64,7 @@ util_blit_pixels(struct blit_state *ctx,
|
|||
void
|
||||
util_blit_pixels_writemask(struct blit_state *ctx,
|
||||
struct pipe_surface *src,
|
||||
struct pipe_sampler_view *src_sampler_view,
|
||||
int srcX0, int srcY0,
|
||||
int srcX1, int srcY1,
|
||||
struct pipe_surface *dst,
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ st_BlitFramebuffer(GLcontext *ctx,
|
|||
const GLbitfield depthStencil = (GL_DEPTH_BUFFER_BIT |
|
||||
GL_STENCIL_BUFFER_BIT);
|
||||
struct st_context *st = ctx->st;
|
||||
struct pipe_context *pipe = st->pipe;
|
||||
const uint pFilter = ((filter == GL_NEAREST)
|
||||
? PIPE_TEX_MIPFILTER_NEAREST
|
||||
: PIPE_TEX_MIPFILTER_LINEAR);
|
||||
|
|
@ -111,8 +112,8 @@ st_BlitFramebuffer(GLcontext *ctx,
|
|||
&readFB->Attachment[readFB->_ColorReadBufferIndex];
|
||||
|
||||
if(srcAtt->Type == GL_TEXTURE) {
|
||||
struct pipe_screen *screen = ctx->st->pipe->screen;
|
||||
const struct st_texture_object *srcObj =
|
||||
struct pipe_screen *screen = pipe->screen;
|
||||
struct st_texture_object *srcObj =
|
||||
st_texture_object(srcAtt->Texture);
|
||||
struct st_renderbuffer *dstRb =
|
||||
st_renderbuffer(drawFB->_ColorDrawBuffers[0]);
|
||||
|
|
@ -132,7 +133,8 @@ st_BlitFramebuffer(GLcontext *ctx,
|
|||
return;
|
||||
|
||||
util_blit_pixels(st->blit,
|
||||
srcSurf, srcX0, srcY0, srcX1, srcY1,
|
||||
srcSurf, st_get_stobj_sampler_view(srcObj, pipe),
|
||||
srcX0, srcY0, srcX1, srcY1,
|
||||
dstSurf, dstX0, dstY0, dstX1, dstY1,
|
||||
0.0, pFilter);
|
||||
|
||||
|
|
@ -144,10 +146,11 @@ st_BlitFramebuffer(GLcontext *ctx,
|
|||
struct st_renderbuffer *dstRb =
|
||||
st_renderbuffer(drawFB->_ColorDrawBuffers[0]);
|
||||
struct pipe_surface *srcSurf = srcRb->surface;
|
||||
struct pipe_sampler_view *srcView = st_renderbuffer_get_sampler_view(srcRb, pipe);
|
||||
struct pipe_surface *dstSurf = dstRb->surface;
|
||||
|
||||
util_blit_pixels(st->blit,
|
||||
srcSurf, srcX0, srcY0, srcX1, srcY1,
|
||||
srcSurf, srcView, srcX0, srcY0, srcX1, srcY1,
|
||||
dstSurf, dstX0, dstY0, dstX1, dstY1,
|
||||
0.0, pFilter);
|
||||
}
|
||||
|
|
@ -179,11 +182,13 @@ st_BlitFramebuffer(GLcontext *ctx,
|
|||
if ((mask & depthStencil) == depthStencil &&
|
||||
srcDepthSurf == srcStencilSurf &&
|
||||
dstDepthSurf == dstStencilSurf) {
|
||||
struct pipe_sampler_view *srcView = st_renderbuffer_get_sampler_view(srcDepthRb, pipe);
|
||||
|
||||
/* Blitting depth and stencil values between combined
|
||||
* depth/stencil buffers. This is the ideal case for such buffers.
|
||||
*/
|
||||
util_blit_pixels(st->blit,
|
||||
srcDepthSurf, srcX0, srcY0, srcX1, srcY1,
|
||||
srcDepthSurf, srcView, srcX0, srcY0, srcX1, srcY1,
|
||||
dstDepthSurf, dstX0, dstY0, dstX1, dstY1,
|
||||
0.0, pFilter);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1457,6 +1457,7 @@ st_copy_texsubimage(GLcontext *ctx,
|
|||
&ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
struct gl_texture_object *texObj =
|
||||
_mesa_select_tex_object(ctx, texUnit, target);
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
struct gl_texture_image *texImage =
|
||||
_mesa_select_tex_image(ctx, texObj, target, level);
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
|
|
@ -1597,6 +1598,7 @@ st_copy_texsubimage(GLcontext *ctx,
|
|||
}
|
||||
util_blit_pixels_writemask(ctx->st->blit,
|
||||
strb->surface,
|
||||
st_get_stobj_sampler_view(stObj),
|
||||
srcX, srcY0,
|
||||
srcX + width, srcY1,
|
||||
dest_surface,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue