mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 23:50:11 +01:00
util: add new fragment shaders to simple_shaders
New shaders: * Fragment shader which writes depth sampled from a texture * Fragment shader which copies COLOR[0] to multiple render targets Additional improvements: * The fragment 'tex' shaders now take a sampler type (TGSI_TEXTURE_*) so that they can sample from any type of texture, not only from a 2D one.
This commit is contained in:
parent
3a15c48ece
commit
dff4c9ed55
4 changed files with 80 additions and 12 deletions
|
|
@ -126,7 +126,8 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)
|
|||
}
|
||||
|
||||
/* fragment shader */
|
||||
ctx->fs[TGSI_WRITEMASK_XYZW] = util_make_fragment_tex_shader(pipe);
|
||||
ctx->fs[TGSI_WRITEMASK_XYZW] =
|
||||
util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D);
|
||||
ctx->vbuf = NULL;
|
||||
|
||||
/* init vertex data that doesn't change */
|
||||
|
|
@ -420,7 +421,9 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
cso_set_sampler_textures(ctx->cso, 1, &tex);
|
||||
|
||||
if (ctx->fs[writemask] == NULL)
|
||||
ctx->fs[writemask] = util_make_fragment_tex_shader_writemask(pipe, writemask);
|
||||
ctx->fs[writemask] =
|
||||
util_make_fragment_tex_shader_writemask(pipe, TGSI_TEXTURE_2D,
|
||||
writemask);
|
||||
|
||||
/* shaders */
|
||||
cso_set_fragment_shader_handle(ctx->cso, ctx->fs[writemask]);
|
||||
|
|
|
|||
|
|
@ -1317,7 +1317,7 @@ util_create_gen_mipmap(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
/* fragment shader */
|
||||
ctx->fs = util_make_fragment_tex_shader(pipe);
|
||||
ctx->fs = util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D);
|
||||
|
||||
/* vertex data that doesn't change */
|
||||
for (i = 0; i < 4; i++) {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
*
|
||||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
* Copyright 2009 Marek Olšák <maraeo@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
|
|
@ -30,6 +31,7 @@
|
|||
* Simple vertex/fragment shader generators.
|
||||
*
|
||||
* @author Brian Paul
|
||||
Marek Olšák
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -87,6 +89,7 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
|
|||
*/
|
||||
void *
|
||||
util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
|
||||
unsigned tex_target,
|
||||
unsigned writemask )
|
||||
{
|
||||
struct ureg_program *ureg;
|
||||
|
|
@ -116,30 +119,82 @@ util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
|
|||
|
||||
ureg_TEX( ureg,
|
||||
ureg_writemask(out, writemask),
|
||||
TGSI_TEXTURE_2D, tex, sampler );
|
||||
tex_target, tex, sampler );
|
||||
ureg_END( ureg );
|
||||
|
||||
return ureg_create_shader_and_destroy( ureg, pipe );
|
||||
}
|
||||
|
||||
void *
|
||||
util_make_fragment_tex_shader(struct pipe_context *pipe )
|
||||
util_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target )
|
||||
{
|
||||
return util_make_fragment_tex_shader_writemask( pipe,
|
||||
tex_target,
|
||||
TGSI_WRITEMASK_XYZW );
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a simple fragment texture shader which reads an X component from
|
||||
* a texture and writes it as depth.
|
||||
*/
|
||||
void *
|
||||
util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
|
||||
unsigned tex_target)
|
||||
{
|
||||
struct ureg_program *ureg;
|
||||
struct ureg_src sampler;
|
||||
struct ureg_src tex;
|
||||
struct ureg_dst out, depth;
|
||||
struct ureg_src imm;
|
||||
|
||||
ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
|
||||
if (ureg == NULL)
|
||||
return NULL;
|
||||
|
||||
sampler = ureg_DECL_sampler( ureg, 0 );
|
||||
|
||||
tex = ureg_DECL_fs_input( ureg,
|
||||
TGSI_SEMANTIC_GENERIC, 0,
|
||||
TGSI_INTERPOLATE_PERSPECTIVE );
|
||||
|
||||
out = ureg_DECL_output( ureg,
|
||||
TGSI_SEMANTIC_COLOR,
|
||||
0 );
|
||||
|
||||
depth = ureg_DECL_output( ureg,
|
||||
TGSI_SEMANTIC_POSITION,
|
||||
0 );
|
||||
|
||||
imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
|
||||
|
||||
ureg_MOV( ureg, out, imm );
|
||||
|
||||
ureg_TEX( ureg,
|
||||
ureg_writemask(depth, TGSI_WRITEMASK_Z),
|
||||
tex_target, tex, sampler );
|
||||
ureg_END( ureg );
|
||||
|
||||
return ureg_create_shader_and_destroy( ureg, pipe );
|
||||
}
|
||||
|
||||
/**
|
||||
* Make simple fragment color pass-through shader.
|
||||
*/
|
||||
void *
|
||||
util_make_fragment_passthrough_shader(struct pipe_context *pipe)
|
||||
{
|
||||
return util_make_fragment_clonecolor_shader(pipe, 1);
|
||||
}
|
||||
|
||||
void *
|
||||
util_make_fragment_clonecolor_shader(struct pipe_context *pipe, int num_cbufs)
|
||||
{
|
||||
struct ureg_program *ureg;
|
||||
struct ureg_src src;
|
||||
struct ureg_dst dst;
|
||||
struct ureg_dst dst[8];
|
||||
int i;
|
||||
|
||||
assert(num_cbufs <= 8);
|
||||
|
||||
ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
|
||||
if (ureg == NULL)
|
||||
|
|
@ -148,12 +203,13 @@ util_make_fragment_passthrough_shader(struct pipe_context *pipe)
|
|||
src = ureg_DECL_fs_input( ureg, TGSI_SEMANTIC_COLOR, 0,
|
||||
TGSI_INTERPOLATE_PERSPECTIVE );
|
||||
|
||||
dst = ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, 0 );
|
||||
for (i = 0; i < num_cbufs; i++)
|
||||
dst[i] = ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, i );
|
||||
|
||||
for (i = 0; i < num_cbufs; i++)
|
||||
ureg_MOV( ureg, dst[i], src );
|
||||
|
||||
ureg_MOV( ureg, dst, src );
|
||||
ureg_END( ureg );
|
||||
|
||||
return ureg_create_shader_and_destroy( ureg, pipe );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -51,16 +51,25 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
|
|||
|
||||
extern void *
|
||||
util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
|
||||
unsigned writemask );
|
||||
unsigned tex_target,
|
||||
unsigned writemask);
|
||||
|
||||
extern void *
|
||||
util_make_fragment_tex_shader(struct pipe_context *pipe);
|
||||
util_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target);
|
||||
|
||||
|
||||
extern void *
|
||||
util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
|
||||
unsigned tex_target);
|
||||
|
||||
|
||||
extern void *
|
||||
util_make_fragment_passthrough_shader(struct pipe_context *pipe);
|
||||
|
||||
|
||||
extern void *
|
||||
util_make_fragment_clonecolor_shader(struct pipe_context *pipe, int num_cbufs);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue