Matteo Bruni : wined3d: Introduce a get_fog_start_end() function.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jun 5 06:46:11 CDT 2015
Module: wine
Branch: master
Commit: b02a166cc84a1c61db9e91e26e6b8e0a8662fd19
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b02a166cc84a1c61db9e91e26e6b8e0a8662fd19
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Fri Jun 5 00:37:32 2015 +0200
wined3d: Introduce a get_fog_start_end() function.
---
dlls/wined3d/state.c | 41 +-------------------------------------
dlls/wined3d/utils.c | 45 ++++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 48 insertions(+), 40 deletions(-)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 917d155..b7d7f92 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1006,47 +1006,8 @@ void state_fogstartend(struct wined3d_context *context, const struct wined3d_sta
{
const struct wined3d_gl_info *gl_info = context->gl_info;
float fogstart, fogend;
- union {
- DWORD d;
- float f;
- } tmpvalue;
-
- switch(context->fog_source) {
- case FOGSOURCE_VS:
- fogstart = 1.0f;
- fogend = 0.0f;
- break;
-
- case FOGSOURCE_COORD:
- fogstart = 255.0f;
- fogend = 0.0f;
- break;
- case FOGSOURCE_FFP:
- tmpvalue.d = state->render_states[WINED3D_RS_FOGSTART];
- fogstart = tmpvalue.f;
- tmpvalue.d = state->render_states[WINED3D_RS_FOGEND];
- fogend = tmpvalue.f;
- /* Special handling for fogstart == fogend. In d3d with vertex
- * fog, everything is fogged. With table fog, everything with
- * fog_coord < fog_start is unfogged, and fog_coord > fog_start
- * is fogged. Windows drivers disagree when fog_coord == fog_start. */
- if (state->render_states[WINED3D_RS_FOGTABLEMODE] == WINED3D_FOG_NONE
- && fogstart == fogend)
- {
- fogstart = -INFINITY;
- fogend = 0.0f;
- }
- break;
-
- default:
- /* This should not happen.context->fog_source is set in wined3d, not the app.
- * Still this is needed to make the compiler happy
- */
- ERR("Unexpected fog coordinate source\n");
- fogstart = 0.0f;
- fogend = 0.0f;
- }
+ get_fog_start_end(context, state, &fogstart, &fogend);
gl_info->gl_ops.gl.p_glFogf(GL_FOG_START, fogstart);
checkGLcall("glFogf(GL_FOG_START, fogstart)");
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 2a4ac83..ed4262a 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -3654,6 +3654,51 @@ void get_pointsize(const struct wined3d_context *context, const struct wined3d_s
*out_pointsize = pointsize.f;
}
+void get_fog_start_end(const struct wined3d_context *context, const struct wined3d_state *state,
+ float *start, float *end)
+{
+ union
+ {
+ DWORD d;
+ float f;
+ } tmpvalue;
+
+ switch (context->fog_source)
+ {
+ case FOGSOURCE_VS:
+ *start = 1.0f;
+ *end = 0.0f;
+ break;
+
+ case FOGSOURCE_COORD:
+ *start = 255.0f;
+ *end = 0.0f;
+ break;
+
+ case FOGSOURCE_FFP:
+ tmpvalue.d = state->render_states[WINED3D_RS_FOGSTART];
+ *start = tmpvalue.f;
+ tmpvalue.d = state->render_states[WINED3D_RS_FOGEND];
+ *end = tmpvalue.f;
+ /* Special handling for fog_start == fog_end. In d3d with vertex
+ * fog, everything is fogged. With table fog, everything with
+ * fog_coord < fog_start is unfogged, and fog_coord > fog_start
+ * is fogged. Windows drivers disagree when fog_coord == fog_start. */
+ if (state->render_states[WINED3D_RS_FOGTABLEMODE] == WINED3D_FOG_NONE && *start == *end)
+ {
+ *start = -INFINITY;
+ *end = 0.0f;
+ }
+ break;
+
+ default:
+ /* This should not happen, context->fog_source is set in wined3d, not the app. */
+ ERR("Unexpected fog coordinate source.\n");
+ *start = 0.0f;
+ *end = 0.0f;
+ }
+}
+
/* This small helper function is used to convert a bitmask into the number of masked bits */
unsigned int count_bits(unsigned int mask)
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d9de679..93cfd9e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3074,6 +3074,8 @@ void get_pointsize_minmax(const struct wined3d_context *context, const struct wi
float *out_min, float *out_max) DECLSPEC_HIDDEN;
void get_pointsize(const struct wined3d_context *context, const struct wined3d_state *state,
float *out_pointsize, float *out_att) DECLSPEC_HIDDEN;
+void get_fog_start_end(const struct wined3d_context *context, const struct wined3d_state *state,
+ float *start, float *end) DECLSPEC_HIDDEN;
/* Using additional shader constants (uniforms in GLSL / program environment
* or local parameters in ARB) is costly:
More information about the wine-cvs
mailing list