Преглед на файлове

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.
tags/7.8-rc1
Marek Olšák преди 16 години
родител
ревизия
dff4c9ed55

+ 5
- 2
src/gallium/auxiliary/util/u_blit.c Целия файл

@@ -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]);

+ 1
- 1
src/gallium/auxiliary/util/u_gen_mipmap.c Целия файл

@@ -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++) {

+ 63
- 7
src/gallium/auxiliary/util/u_simple_shaders.c Целия файл

@@ -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 );
}



+ 11
- 2
src/gallium/auxiliary/util/u_simple_shaders.h Целия файл

@@ -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…
Отказ
Запис