* \author Eric Anholt <eric@anholt.net>
*/
-#include "../glsl/glsl_types.h"
-#include "../glsl/ir.h"
+#include "glsl/glsl_types.h"
+#include "glsl/ir.h"
+#include "program/prog_instruction.h" /* For WRITEMASK_* */
class brw_cubemap_normalize_visitor : public ir_hierarchical_visitor {
public:
if (ir->sampler->type->sampler_dimensionality != GLSL_SAMPLER_DIM_CUBE)
return visit_continue;
+ if (!ir->coordinate)
+ return visit_continue;
+
void *mem_ctx = ralloc_parent(ir);
ir_variable *var = new(mem_ctx) ir_variable(ir->coordinate->type,
glsl_type::float_type,
expr, NULL);
- deref = new(mem_ctx) ir_dereference_variable(var);
- ir->coordinate = new(mem_ctx) ir_expression(ir_binop_mul,
- ir->coordinate->type,
- deref,
- expr);
+ /* coordinate.xyz *= expr */
+ assign = new(mem_ctx) ir_assignment(
+ new(mem_ctx) ir_dereference_variable(var),
+ new(mem_ctx) ir_swizzle(
+ new(mem_ctx) ir_expression(ir_binop_mul,
+ ir->coordinate->type,
+ new(mem_ctx) ir_dereference_variable(var),
+ expr),
+ 0, 1, 2, 0, 3));
+ assign->write_mask = WRITEMASK_XYZ;
+ base_ir->insert_before(assign);
+ ir->coordinate = new(mem_ctx) ir_dereference_variable(var);
progress = true;
return visit_continue;
extern "C" {
-GLboolean
+bool
brw_do_cubemap_normalize(exec_list *instructions)
{
brw_cubemap_normalize_visitor v;