summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/pipe/i915simple/i915_context.h9
-rw-r--r--src/mesa/pipe/i915simple/i915_state.c83
-rw-r--r--src/mesa/pipe/i915simple/i915_state_dynamic.c46
-rw-r--r--src/mesa/pipe/i915simple/i915_state_immediate.c32
4 files changed, 88 insertions, 82 deletions
diff --git a/src/mesa/pipe/i915simple/i915_context.h b/src/mesa/pipe/i915simple/i915_context.h
index 9052c92d72..ea6d1ce87b 100644
--- a/src/mesa/pipe/i915simple/i915_context.h
+++ b/src/mesa/pipe/i915simple/i915_context.h
@@ -113,7 +113,12 @@ struct i915_state
unsigned id; /* track lost context events */
};
-
+struct i915_blend_state {
+ unsigned iab;
+ unsigned modes4;
+ unsigned LIS5;
+ unsigned LIS6;
+};
struct i915_context
{
@@ -123,7 +128,7 @@ struct i915_context
/* The most recent drawing state as set by the driver:
*/
- const struct pipe_blend_state *blend;
+ const struct i915_blend_state *blend;
const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
const struct pipe_depth_stencil_state *depth_stencil;
const struct pipe_rasterizer_state *rasterizer;
diff --git a/src/mesa/pipe/i915simple/i915_state.c b/src/mesa/pipe/i915simple/i915_state.c
index 86c108978f..4a4d26be65 100644
--- a/src/mesa/pipe/i915simple/i915_state.c
+++ b/src/mesa/pipe/i915simple/i915_state.c
@@ -33,7 +33,9 @@
#include "pipe/p_winsys.h"
#include "i915_context.h"
+#include "i915_reg.h"
#include "i915_state.h"
+#include "i915_state_inlines.h"
/* None of this state is actually used for anything yet.
*/
@@ -42,25 +44,90 @@ static void *
i915_create_blend_state(struct pipe_context *pipe,
const struct pipe_blend_state *blend)
{
- struct pipe_blend_state *new_blend = malloc(sizeof(struct pipe_blend_state));
- memcpy(new_blend, blend, sizeof(struct pipe_blend_state));
+ struct i915_blend_state *cso_data = calloc(1, sizeof(struct i915_blend_state));
- return new_blend;
+ {
+ unsigned eqRGB = blend->rgb_func;
+ unsigned srcRGB = blend->rgb_src_factor;
+ unsigned dstRGB = blend->rgb_dst_factor;
+
+ unsigned eqA = blend->alpha_func;
+ unsigned srcA = blend->alpha_src_factor;
+ unsigned dstA = blend->alpha_dst_factor;
+
+ /* Special handling for MIN/MAX filter modes handled at
+ * state_tracker level.
+ */
+
+ if (srcA != srcRGB ||
+ dstA != dstRGB ||
+ eqA != eqRGB) {
+
+ cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+ IAB_MODIFY_ENABLE |
+ IAB_ENABLE |
+ IAB_MODIFY_FUNC |
+ IAB_MODIFY_SRC_FACTOR |
+ IAB_MODIFY_DST_FACTOR |
+ SRC_ABLND_FACT(i915_translate_blend_factor(srcA)) |
+ DST_ABLND_FACT(i915_translate_blend_factor(dstA)) |
+ (i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT));
+ }
+ else {
+ cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+ IAB_MODIFY_ENABLE |
+ 0);
+ }
+ }
+
+ cso_data->modes4 |= (_3DSTATE_MODES_4_CMD |
+ ENABLE_LOGIC_OP_FUNC |
+ LOGIC_OP_FUNC(i915_translate_logic_op(blend->logicop_func)));
+
+ if (blend->logicop_enable)
+ cso_data->LIS5 |= S5_LOGICOP_ENABLE;
+
+ if (blend->dither)
+ cso_data->LIS5 |= S5_COLOR_DITHER_ENABLE;
+
+ if ((blend->colormask & PIPE_MASK_R) == 0)
+ cso_data->LIS5 |= S5_WRITEDISABLE_RED;
+
+ if ((blend->colormask & PIPE_MASK_G) == 0)
+ cso_data->LIS5 |= S5_WRITEDISABLE_GREEN;
+
+ if ((blend->colormask & PIPE_MASK_B) == 0)
+ cso_data->LIS5 |= S5_WRITEDISABLE_BLUE;
+
+ if ((blend->colormask & PIPE_MASK_A) == 0)
+ cso_data->LIS5 |= S5_WRITEDISABLE_ALPHA;
+
+ if (blend->blend_enable) {
+ unsigned funcRGB = blend->rgb_func;
+ unsigned srcRGB = blend->rgb_src_factor;
+ unsigned dstRGB = blend->rgb_dst_factor;
+
+ cso_data->LIS6 |= (S6_CBUF_BLEND_ENABLE |
+ SRC_BLND_FACT(i915_translate_blend_factor(srcRGB)) |
+ DST_BLND_FACT(i915_translate_blend_factor(dstRGB)) |
+ (i915_translate_blend_func(funcRGB) << S6_CBUF_BLEND_FUNC_SHIFT));
+ }
+
+ return cso_data;
}
-static void i915_bind_blend_state( struct pipe_context *pipe,
- void *blend )
+static void i915_bind_blend_state(struct pipe_context *pipe,
+ void *blend)
{
struct i915_context *i915 = i915_context(pipe);
- i915->blend = (struct pipe_blend_state *)blend;
+ i915->blend = (struct i915_blend_state*)blend;
i915->dirty |= I915_NEW_BLEND;
}
-static void i915_delete_blend_state( struct pipe_context *pipe,
- void *blend )
+static void i915_delete_blend_state(struct pipe_context *pipe, void *blend)
{
free(blend);
}
diff --git a/src/mesa/pipe/i915simple/i915_state_dynamic.c b/src/mesa/pipe/i915simple/i915_state_dynamic.c
index a9791962e2..262ac947b8 100644
--- a/src/mesa/pipe/i915simple/i915_state_dynamic.c
+++ b/src/mesa/pipe/i915simple/i915_state_dynamic.c
@@ -79,12 +79,8 @@ static void upload_MODES4( struct i915_context *i915 )
}
/* I915_NEW_BLEND */
- {
- modes4 |= (_3DSTATE_MODES_4_CMD |
- ENABLE_LOGIC_OP_FUNC |
- LOGIC_OP_FUNC(i915_translate_logic_op(i915->blend->logicop_func)));
- }
-
+ modes4 |= i915->blend->modes4;
+
/* Always, so that we know when state is in-active:
*/
set_dynamic_indirect( i915,
@@ -201,44 +197,10 @@ const struct i915_tracked_state i915_upload_BLENDCOLOR = {
static void upload_IAB( struct i915_context *i915 )
{
- unsigned iab = 0;
-
- {
- unsigned eqRGB = i915->blend->rgb_func;
- unsigned srcRGB = i915->blend->rgb_src_factor;
- unsigned dstRGB = i915->blend->rgb_dst_factor;
+ unsigned iab = i915->blend->iab;
- unsigned eqA = i915->blend->alpha_func;
- unsigned srcA = i915->blend->alpha_src_factor;
- unsigned dstA = i915->blend->alpha_dst_factor;
- /* Special handling for MIN/MAX filter modes handled at
- * state_tracker level.
- */
-
- if (srcA != srcRGB ||
- dstA != dstRGB ||
- eqA != eqRGB) {
-
- iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
- IAB_MODIFY_ENABLE |
- IAB_ENABLE |
- IAB_MODIFY_FUNC |
- IAB_MODIFY_SRC_FACTOR |
- IAB_MODIFY_DST_FACTOR |
- SRC_ABLND_FACT(i915_translate_blend_factor(srcA)) |
- DST_ABLND_FACT(i915_translate_blend_factor(dstA)) |
- (i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT));
- }
- else {
- iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
- IAB_MODIFY_ENABLE |
- 0);
- }
- }
-
-
- set_dynamic_indirect( i915,
+ set_dynamic_indirect( i915,
I915_DYNAMIC_IAB,
&iab,
1 );
diff --git a/src/mesa/pipe/i915simple/i915_state_immediate.c b/src/mesa/pipe/i915simple/i915_state_immediate.c
index 73508f557f..38cf2adc71 100644
--- a/src/mesa/pipe/i915simple/i915_state_immediate.c
+++ b/src/mesa/pipe/i915simple/i915_state_immediate.c
@@ -144,25 +144,7 @@ static void upload_S5( struct i915_context *i915 )
(dpop << S5_STENCIL_PASS_Z_PASS_SHIFT));
}
- /* I915_NEW_BLEND */
- if (i915->blend->logicop_enable)
- LIS5 |= S5_LOGICOP_ENABLE;
-
- if (i915->blend->dither)
- LIS5 |= S5_COLOR_DITHER_ENABLE;
-
- if ((i915->blend->colormask & PIPE_MASK_R) == 0)
- LIS5 |= S5_WRITEDISABLE_RED;
-
- if ((i915->blend->colormask & PIPE_MASK_G) == 0)
- LIS5 |= S5_WRITEDISABLE_GREEN;
-
- if ((i915->blend->colormask & PIPE_MASK_B) == 0)
- LIS5 |= S5_WRITEDISABLE_BLUE;
-
- if ((i915->blend->colormask & PIPE_MASK_A) == 0)
- LIS5 |= S5_WRITEDISABLE_ALPHA;
-
+ LIS5 |= i915->blend->LIS5;
#if 0
/* I915_NEW_RASTERIZER */
@@ -205,17 +187,7 @@ static void upload_S6( struct i915_context *i915 )
/* I915_NEW_BLEND
*/
- if (i915->blend->blend_enable)
- {
- unsigned funcRGB = i915->blend->rgb_func;
- unsigned srcRGB = i915->blend->rgb_src_factor;
- unsigned dstRGB = i915->blend->rgb_dst_factor;
-
- LIS6 |= (S6_CBUF_BLEND_ENABLE |
- SRC_BLND_FACT(i915_translate_blend_factor(srcRGB)) |
- DST_BLND_FACT(i915_translate_blend_factor(dstRGB)) |
- (i915_translate_blend_func(funcRGB) << S6_CBUF_BLEND_FUNC_SHIFT));
- }
+ LIS6 |= i915->blend->LIS6;
/* I915_NEW_DEPTH
*/