Skip to content

Commit

Permalink
ColorBlendAttrib: support separate alpha mode and dual-src blend. bam…
Browse files Browse the repository at this point in the history
… 6.42
  • Loading branch information
rdb committed Apr 8, 2016
1 parent e73a897 commit f0cd1ce
Show file tree
Hide file tree
Showing 13 changed files with 381 additions and 78 deletions.
9 changes: 9 additions & 0 deletions panda/src/display/graphicsStateGuardian.I
Expand Up @@ -684,6 +684,15 @@ get_max_color_targets() const {
return _max_color_targets;
}

/**
* Returns true if dual source (incoming1_color and incoming1_alpha) blend
* operands are supported by this GSG.
*/
INLINE bool GraphicsStateGuardian::
get_supports_dual_source_blending() const {
return _supports_dual_source_blending;
}

/**
* Deprecated. Use get_max_color_targets() instead, which returns the exact
* same value.
Expand Down
1 change: 1 addition & 0 deletions panda/src/display/graphicsStateGuardian.cxx
Expand Up @@ -246,6 +246,7 @@ GraphicsStateGuardian(CoordinateSystem internal_coordinate_system,

// Assume a maximum of 1 render target in absence of MRT.
_max_color_targets = 1;
_supports_dual_source_blending = false;

_supported_geom_rendering = 0;

Expand Down
3 changes: 3 additions & 0 deletions panda/src/display/graphicsStateGuardian.h
Expand Up @@ -172,6 +172,7 @@ class EXPCL_PANDA_DISPLAY GraphicsStateGuardian : public GraphicsStateGuardianBa

INLINE int get_max_color_targets() const;
INLINE int get_maximum_simultaneous_render_targets() const;
INLINE bool get_supports_dual_source_blending() const;

MAKE_PROPERTY(max_vertices_per_array, get_max_vertices_per_array);
MAKE_PROPERTY(max_vertices_per_primitive, get_max_vertices_per_primitive);
Expand Down Expand Up @@ -217,6 +218,7 @@ class EXPCL_PANDA_DISPLAY GraphicsStateGuardian : public GraphicsStateGuardianBa
MAKE_PROPERTY(supports_timer_query, get_supports_timer_query);
MAKE_PROPERTY(timer_queries_active, get_timer_queries_active);
MAKE_PROPERTY(max_color_targets, get_max_color_targets);
MAKE_PROPERTY(supports_dual_source_blending, get_supports_dual_source_blending);

INLINE ShaderModel get_shader_model() const;
INLINE void set_shader_model(ShaderModel shader_model);
Expand Down Expand Up @@ -609,6 +611,7 @@ class EXPCL_PANDA_DISPLAY GraphicsStateGuardian : public GraphicsStateGuardianBa
bool _supports_indirect_draw;

int _max_color_targets;
bool _supports_dual_source_blending;

int _supported_geom_rendering;
bool _color_scale_via_lighting;
Expand Down
87 changes: 56 additions & 31 deletions panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx
Expand Up @@ -3766,43 +3766,24 @@ do_issue_blending() {
}
}

const ColorBlendAttrib *target_color_blend = DCAST(ColorBlendAttrib, _target_rs->get_attrib_def(ColorBlendAttrib::get_class_slot()));
CPT(ColorBlendAttrib) color_blend = target_color_blend;
ColorBlendAttrib::Mode color_blend_mode = target_color_blend->get_mode();
const ColorBlendAttrib *color_blend;
_target_rs->get_attrib_def(color_blend);
ColorBlendAttrib::Mode color_blend_mode = color_blend->get_mode();

const TransparencyAttrib *target_transparency = DCAST(TransparencyAttrib, _target_rs->get_attrib_def(TransparencyAttrib::get_class_slot()));
const TransparencyAttrib *target_transparency;
_target_rs->get_attrib_def(target_transparency);
TransparencyAttrib::Mode transparency_mode = target_transparency->get_mode();

// Is there a color blend set?
if (color_blend_mode != ColorBlendAttrib::M_none) {
set_render_state(D3DRS_ALPHABLENDENABLE, TRUE);

switch (color_blend_mode) {
case ColorBlendAttrib::M_add:
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_ADD);
break;

case ColorBlendAttrib::M_subtract:
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_SUBTRACT);
break;

case ColorBlendAttrib::M_inv_subtract:
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_REVSUBTRACT);
break;

case ColorBlendAttrib::M_min:
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_MIN);
break;

case ColorBlendAttrib::M_max:
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_MAX);
break;
}

set_render_state(D3DRS_SRCBLEND,
get_blend_func(color_blend->get_operand_a()));
set_render_state(D3DRS_DESTBLEND,
get_blend_func(color_blend->get_operand_b()));
set_render_state(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
set_render_state(D3DRS_BLENDOP, get_blend_mode(color_blend_mode));
set_render_state(D3DRS_BLENDOPALPHA, get_blend_mode(color_blend->get_alpha_mode()));
set_render_state(D3DRS_SRCBLEND, get_blend_func(color_blend->get_operand_a()));
set_render_state(D3DRS_DESTBLEND, get_blend_func(color_blend->get_operand_b()));
set_render_state(D3DRS_SRCBLENDALPHA, get_blend_func(color_blend->get_alpha_operand_a()));
set_render_state(D3DRS_DESTBLENDALPHA, get_blend_func(color_blend->get_alpha_operand_b()));
return;
}

Expand All @@ -3817,13 +3798,15 @@ do_issue_blending() {
case TransparencyAttrib::M_multisample_mask:
case TransparencyAttrib::M_dual:
set_render_state(D3DRS_ALPHABLENDENABLE, TRUE);
set_render_state(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_ADD);
set_render_state(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
set_render_state(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
return;

case TransparencyAttrib::M_premultiplied_alpha:
set_render_state(D3DRS_ALPHABLENDENABLE, TRUE);
set_render_state(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
set_render_state(D3DRS_BLENDOP, D3DBLENDOP_ADD);
set_render_state(D3DRS_SRCBLEND, D3DBLEND_ONE);
set_render_state(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
Expand Down Expand Up @@ -4052,6 +4035,33 @@ get_light_color(Light *light) const {
return *(D3DCOLORVALUE *)cf.get_data();
}

/**
* Maps from ColorBlendAttrib::Mode to D3DBLENDOP vaule.
*/
D3DBLENDOP DXGraphicsStateGuardian9::
get_blend_mode(ColorBlendAttrib::Mode mode) {
switch (mode) {
case ColorBlendAttrib::M_add:
return D3DBLENDOP_ADD;

case ColorBlendAttrib::M_subtract:
return D3DBLENDOP_SUBTRACT;

case ColorBlendAttrib::M_inv_subtract:
return D3DBLENDOP_REVSUBTRACT;

case ColorBlendAttrib::M_min:
return D3DBLENDOP_MIN;

case ColorBlendAttrib::M_max:
return D3DBLENDOP_MAX;
}

dxgsg9_cat.error()
<< "Unknown color blend mode " << (int)mode << endl;
return D3DBLENDOP_ADD;
}

/**
* Maps from ColorBlendAttrib::Operand to D3DBLEND value.
*/
Expand Down Expand Up @@ -4106,6 +4116,21 @@ get_blend_func(ColorBlendAttrib::Operand operand) {

case ColorBlendAttrib::O_incoming_color_saturate:
return D3DBLEND_SRCALPHASAT;

case ColorBlendAttrib::O_incoming1_color:
return D3DBLEND_SRCCOLOR2;

case ColorBlendAttrib::O_one_minus_incoming1_color:
return D3DBLEND_INVSRCCOLOR2;

case ColorBlendAttrib::O_incoming1_alpha:
// Not supported by DX.
return D3DBLEND_SRCCOLOR2;

case ColorBlendAttrib::O_one_minus_incoming1_alpha:
// Not supported by DX.
return D3DBLEND_INVSRCCOLOR2;

}

dxgsg9_cat.error()
Expand Down
1 change: 1 addition & 0 deletions panda/src/dxgsg9/dxGraphicsStateGuardian9.h
Expand Up @@ -217,6 +217,7 @@ class EXPCL_PANDADX DXGraphicsStateGuardian9 : public GraphicsStateGuardian {
const D3DCOLORVALUE &get_light_color(Light *light) const;
INLINE static D3DTRANSFORMSTATETYPE get_tex_mat_sym(int stage_index);

static D3DBLENDOP get_blend_mode(ColorBlendAttrib::Mode mode);
static D3DBLEND get_blend_func(ColorBlendAttrib::Operand operand);
void report_texmgr_stats();

Expand Down
4 changes: 4 additions & 0 deletions panda/src/gles2gsg/gles2gsg.h
Expand Up @@ -123,6 +123,10 @@ typedef char GLchar;
#define GL_MAX_DRAW_BUFFERS GL_MAX_DRAW_BUFFERS_NV
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE
#define GL_SRC1_COLOR GL_SRC1_COLOR_EXT
#define GL_ONE_MINUS_SRC1_COLOR GL_ONE_MINUS_SRC1_COLOR_EXT
#define GL_SRC1_ALPHA GL_SRC1_ALPHA_EXT
#define GL_ONE_MINUS_SRC1_ALPHA GL_ONE_MINUS_SRC1_ALPHA_EXT

// For GLES 3 compat - need a better solution for this
#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x1
Expand Down
11 changes: 11 additions & 0 deletions panda/src/gles2gsg/panda_esgl2ext.h
Expand Up @@ -430,6 +430,17 @@ typedef struct __GLsync *GLsync;
* EXT extension tokens
*------------------------------------------------------------------------*/

#ifndef GL_EXT_blend_func_extended
#define GL_EXT_blend_func_extended 1
#define GL_SRC1_COLOR_EXT 0x88F9
#define GL_SRC1_ALPHA_EXT 0x8589
#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA
#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB
#define GL_SRC_ALPHA_SATURATE_EXT 0x0308
#define GL_LOCATION_INDEX_EXT 0x930F
#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC
#endif

/* GL_EXT_blend_minmax */
#ifndef GL_EXT_blend_minmax
#define GL_MIN_EXT 0x8007
Expand Down

0 comments on commit f0cd1ce

Please sign in to comment.