glsl: Add a new ir_txs (textureSize) opcode to ir_texture.
One unique aspect of TXS is that it doesn't have a coordinate. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
8f26b59f53
commit
1e3bcbdf31
11 changed files with 65 additions and 36 deletions
|
|
@ -885,6 +885,8 @@ ir_reader::read_texture(s_expression *expr)
|
|||
{ "tex", s_type, s_sampler, s_coord, s_offset, s_proj, s_shadow };
|
||||
s_pattern txf_pattern[] =
|
||||
{ "txf", s_type, s_sampler, s_coord, s_offset, s_lod };
|
||||
s_pattern txs_pattern[] =
|
||||
{ "txs", s_type, s_sampler, s_lod };
|
||||
s_pattern other_pattern[] =
|
||||
{ tag, s_type, s_sampler, s_coord, s_offset, s_proj, s_shadow, s_lod };
|
||||
|
||||
|
|
@ -892,6 +894,8 @@ ir_reader::read_texture(s_expression *expr)
|
|||
op = ir_tex;
|
||||
} else if (MATCH(expr, txf_pattern)) {
|
||||
op = ir_txf;
|
||||
} else if (MATCH(expr, txs_pattern)) {
|
||||
op = ir_txs;
|
||||
} else if (MATCH(expr, other_pattern)) {
|
||||
op = ir_texture::get_opcode(tag->value());
|
||||
if (op == -1)
|
||||
|
|
@ -920,25 +924,27 @@ ir_reader::read_texture(s_expression *expr)
|
|||
}
|
||||
tex->set_sampler(sampler, type);
|
||||
|
||||
// Read coordinate (any rvalue)
|
||||
tex->coordinate = read_rvalue(s_coord);
|
||||
if (tex->coordinate == NULL) {
|
||||
ir_read_error(NULL, "when reading coordinate in (%s ...)",
|
||||
tex->opcode_string());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Read texel offset - either 0 or an rvalue.
|
||||
s_int *si_offset = SX_AS_INT(s_offset);
|
||||
if (si_offset == NULL || si_offset->value() != 0) {
|
||||
tex->offset = read_rvalue(s_offset);
|
||||
if (tex->offset == NULL) {
|
||||
ir_read_error(s_offset, "expected 0 or an expression");
|
||||
if (op != ir_txs) {
|
||||
// Read coordinate (any rvalue)
|
||||
tex->coordinate = read_rvalue(s_coord);
|
||||
if (tex->coordinate == NULL) {
|
||||
ir_read_error(NULL, "when reading coordinate in (%s ...)",
|
||||
tex->opcode_string());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Read texel offset - either 0 or an rvalue.
|
||||
s_int *si_offset = SX_AS_INT(s_offset);
|
||||
if (si_offset == NULL || si_offset->value() != 0) {
|
||||
tex->offset = read_rvalue(s_offset);
|
||||
if (tex->offset == NULL) {
|
||||
ir_read_error(s_offset, "expected 0 or an expression");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (op != ir_txf) {
|
||||
if (op != ir_txf && op != ir_txs) {
|
||||
s_int *proj_as_int = SX_AS_INT(s_proj);
|
||||
if (proj_as_int && proj_as_int->value() == 1) {
|
||||
tex->projector = NULL;
|
||||
|
|
@ -973,6 +979,7 @@ ir_reader::read_texture(s_expression *expr)
|
|||
break;
|
||||
case ir_txl:
|
||||
case ir_txf:
|
||||
case ir_txs:
|
||||
tex->lod_info.lod = read_rvalue(s_lod);
|
||||
if (tex->lod_info.lod == NULL) {
|
||||
ir_read_error(NULL, "when reading LOD in (%s ...)",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue