[Mesa-dev] [PATCH 17/19] i965/fs: ralloc fs_inst's fs_reg sources.
Matt Turner
mattst88 at gmail.com
Thu Feb 20 13:41:30 PST 2014
Potentially we'll want more than three sources for Phi nodes.
To avoid passing a mem_ctx parameter into each fs_inst() constructor, we
add a static thread-local variable to fs_inst that we set in the
fs_visitor() constructor.
---
Is __thread good enough? What about multi-context GL?
src/mesa/drivers/dri/i965/brw_fs.cpp | 10 ++++++++++
src/mesa/drivers/dri/i965/brw_fs.h | 4 +++-
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 2 ++
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 77cdfa2..4d13446 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -51,10 +51,15 @@ extern "C" {
#include "brw_fs_live_variables.h"
#include "glsl/glsl_types.h"
+__thread void *fs_inst::mem_ctx;
+
void
fs_inst::init()
{
memset(this, 0, sizeof(*this));
+ assert(fs_inst::mem_ctx != NULL);
+
+ this->src = rzalloc_array(mem_ctx, fs_reg, 3);
/* This will be the case for almost all instructions. */
this->regs_written = 1;
@@ -111,6 +116,11 @@ dst:
fs_inst::fs_inst(const fs_inst &that)
{
memcpy(this, &that, sizeof(that));
+
+ this->src = ralloc_array(mem_ctx, fs_reg, 3);
+
+ for (int i = 0; i < 3; i++)
+ this->src[i] = that.src[i];
}
#define ALU1(op) \
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index f73f835..3623000 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -192,7 +192,7 @@ public:
bool writes_flag();
fs_reg dst;
- fs_reg src[3];
+ fs_reg *src;
/** @{
* Annotation for the generated IR. One of the two can be set.
@@ -223,6 +223,8 @@ public:
uint8_t force_uncompressed:1;
uint8_t force_sechalf:1;
uint8_t force_writemask_all:1;
+
+ static __thread void *mem_ctx;
};
/**
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 76f93c9..89f39a5 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -2947,6 +2947,7 @@ fs_visitor::fs_visitor(struct brw_context *brw,
this->stage_prog_data = &c->prog_data.base;
this->ctx = &brw->ctx;
this->mem_ctx = ralloc_context(NULL);
+ fs_inst::mem_ctx = this->mem_ctx;
if (shader_prog)
shader = (struct brw_shader *)
shader_prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
@@ -2986,5 +2987,6 @@ fs_visitor::fs_visitor(struct brw_context *brw,
fs_visitor::~fs_visitor()
{
ralloc_free(this->mem_ctx);
+ fs_inst::mem_ctx = NULL;
hash_table_dtor(this->variable_ht);
}
--
1.8.3.2
More information about the mesa-dev
mailing list