From 0ef61a162a7f1d5b7e405e5d858514d24c64e440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 5 Dec 2020 12:03:42 -0500 Subject: [PATCH] mesa: remove code for old (mostly unsupported) GL_NV_point_sprite Reviewed-by: Eric Anholt Part-of: --- docs/relnotes/new_features.txt | 1 + src/mesa/drivers/dri/r200/r200_state.c | 1 - src/mesa/main/attrib.c | 10 ++++---- src/mesa/main/dlist.c | 10 ++++---- src/mesa/main/enable.c | 14 +++++------ src/mesa/main/extensions.c | 1 - src/mesa/main/extensions_table.h | 1 - src/mesa/main/get.c | 3 +-- src/mesa/main/get_hash_params.py | 7 +++--- src/mesa/main/glthread_marshal.h | 3 +-- src/mesa/main/mtypes.h | 4 +--- src/mesa/main/points.c | 31 +++--------------------- src/mesa/main/texenv.c | 33 ++++++++++++-------------- src/mesa/state_tracker/st_extensions.c | 2 -- src/mesa/swrast/s_points.c | 11 ++------- 15 files changed, 42 insertions(+), 90 deletions(-) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index ec0b4af7592..bfc0c458528 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -1,5 +1,6 @@ GL_EXT_demote_to_helper_invocation on radeonsi EGL_MESA_platform_xcb +Removed GL_NV_point_sprite for classic swrast. driconf: remove glx_disable_oml_sync_control, glx_disable_sgi_video_sync, and glx_disable_ext_buffer_age Removed support for loading DRI drivers older than Mesa 8.0, including all DRI1 support Add support for VK_VALVE_mutable_descriptor_type on RADV diff --git a/src/mesa/drivers/dri/r200/r200_state.c b/src/mesa/drivers/dri/r200/r200_state.c index 1f40e4e6c70..d843fa199a2 100644 --- a/src/mesa/drivers/dri/r200/r200_state.c +++ b/src/mesa/drivers/dri/r200/r200_state.c @@ -630,7 +630,6 @@ static void r200PointParameter( struct gl_context *ctx, GLenum pname, const GLfl /* don't support multisampling, so doesn't matter. */ break; /* can't do these but don't need them. - case GL_POINT_SPRITE_R_MODE_NV: case GL_POINT_SPRITE_COORD_ORIGIN: */ default: fprintf(stderr, "bad pname parameter in r200PointParameter\n"); diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 8f1fff8dfaa..11677eb2c3a 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -388,9 +388,9 @@ pop_enable_group(struct gl_context *ctx, const struct gl_enable_attrib_node *ena GL_RASTER_POSITION_UNCLIPPED_IBM); TEST_AND_UPDATE(ctx->Point.SmoothFlag, enable->PointSmooth, GL_POINT_SMOOTH); - if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite) { + if (ctx->Extensions.ARB_point_sprite) { TEST_AND_UPDATE(ctx->Point.PointSprite, enable->PointSprite, - GL_POINT_SPRITE_NV); + GL_POINT_SPRITE); } TEST_AND_UPDATE(ctx->Polygon.OffsetPoint, enable->PolygonOffsetPoint, GL_POLYGON_OFFSET_POINT); @@ -970,7 +970,7 @@ _mesa_PopAttrib(void) TEST_AND_CALL1_SEL(Point.MaxSize, PointParameterf, GL_POINT_SIZE_MAX_EXT); TEST_AND_CALL1_SEL(Point.Threshold, PointParameterf, GL_POINT_FADE_THRESHOLD_SIZE_EXT); } - if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite) { + if (ctx->Extensions.ARB_point_sprite) { if (ctx->Point.CoordReplace != attr->Point.CoordReplace) { ctx->NewState |= _NEW_POINT; ctx->Point.CoordReplace = attr->Point.CoordReplace; @@ -988,9 +988,7 @@ _mesa_PopAttrib(void) } } TEST_AND_UPDATE(ctx->Point.PointSprite, attr->Point.PointSprite, - GL_POINT_SPRITE_NV); - if (ctx->Extensions.NV_point_sprite) - TEST_AND_CALL1_SEL(Point.SpriteRMode, PointParameteri, GL_POINT_SPRITE_R_MODE_NV); + GL_POINT_SPRITE); if ((ctx->API == API_OPENGL_COMPAT && ctx->Version >= 20) || ctx->API == API_OPENGL_CORE) diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 150a07a4187..b74790f01f9 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -3783,7 +3783,7 @@ save_PointParameterfEXT(GLenum pname, GLfloat param) } static void GLAPIENTRY -save_PointParameteriNV(GLenum pname, GLint param) +save_PointParameteri(GLenum pname, GLint param) { GLfloat parray[3]; parray[0] = (GLfloat) param; @@ -3792,7 +3792,7 @@ save_PointParameteriNV(GLenum pname, GLint param) } static void GLAPIENTRY -save_PointParameterivNV(GLenum pname, const GLint * param) +save_PointParameteriv(GLenum pname, const GLint * param) { GLfloat parray[3]; parray[0] = (GLfloat) param[0]; @@ -14279,9 +14279,9 @@ _mesa_initialize_save_table(const struct gl_context *ctx) SET_BindFragmentShaderATI(table, save_BindFragmentShaderATI); SET_SetFragmentShaderConstantATI(table, save_SetFragmentShaderConstantATI); - /* 262. GL_NV_point_sprite */ - SET_PointParameteri(table, save_PointParameteriNV); - SET_PointParameteriv(table, save_PointParameterivNV); + /* 262. GL_ARB_point_sprite */ + SET_PointParameteri(table, save_PointParameteri); + SET_PointParameteriv(table, save_PointParameteriv); /* 268. GL_EXT_stencil_two_side */ SET_ActiveStencilFaceEXT(table, save_ActiveStencilFaceEXT); diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index c469faa45ad..0c5579b0dd0 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -1047,11 +1047,10 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state) ctx->Transform.RasterPositionUnclipped = state; break; - /* GL_NV_point_sprite */ - case GL_POINT_SPRITE_NV: + /* GL_ARB_point_sprite */ + case GL_POINT_SPRITE: if (!(ctx->API == API_OPENGL_COMPAT && - (_mesa_has_ARB_point_sprite(ctx) || - _mesa_has_NV_point_sprite(ctx))) && + _mesa_has_ARB_point_sprite(ctx)) && !_mesa_has_OES_point_sprite(ctx)) goto invalid_enum_error; if (ctx->Point.PointSprite == state) @@ -1824,11 +1823,10 @@ _mesa_IsEnabled( GLenum cap ) goto invalid_enum_error; return ctx->Transform.RasterPositionUnclipped; - /* GL_NV_point_sprite */ - case GL_POINT_SPRITE_NV: + /* GL_ARB_point_sprite */ + case GL_POINT_SPRITE: if (!(ctx->API == API_OPENGL_COMPAT && - (_mesa_has_ARB_point_sprite(ctx) || - _mesa_has_NV_point_sprite(ctx))) && + _mesa_has_ARB_point_sprite(ctx)) && !_mesa_has_OES_point_sprite(ctx)) goto invalid_enum_error; return ctx->Point.PointSprite; diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index d2746f2b31f..367b93e1e7d 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -180,7 +180,6 @@ _mesa_enable_sw_extensions(struct gl_context *ctx) ctx->Extensions.EXT_vertex_array_bgra = GL_TRUE; ctx->Extensions.MESA_ycbcr_texture = GL_TRUE; ctx->Extensions.NV_conditional_render = GL_TRUE; - ctx->Extensions.NV_point_sprite = GL_TRUE; ctx->Extensions.NV_texture_env_combine4 = GL_TRUE; ctx->Extensions.NV_texture_rectangle = GL_TRUE; ctx->Extensions.EXT_gpu_program_parameters = GL_TRUE; diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index 14b0b8df677..a6953030c05 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -395,7 +395,6 @@ EXT(NV_image_formats , ARB_shader_image_load_store EXT(NV_light_max_exponent , dummy_true , GLL, x , x , x , 1999) EXT(NV_packed_depth_stencil , dummy_true , GLL, GLC, x , x , 2000) EXT(NV_pixel_buffer_object , EXT_pixel_buffer_object , x , x , x , ES2, 2012) -EXT(NV_point_sprite , NV_point_sprite , GLL, GLC, x , x , 2001) EXT(NV_primitive_restart , NV_primitive_restart , GLL, x , x , x , 2002) EXT(NV_read_buffer , dummy_true , x , x , x , ES2, 2011) EXT(NV_read_depth , dummy_true , x , x , x , ES2, 2011) diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 7c25ebae442..73e10c9ed16 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -498,7 +498,6 @@ EXTRA_EXT(ARB_texture_cube_map); EXTRA_EXT(EXT_texture_array); EXTRA_EXT(NV_fog_distance); EXTRA_EXT(EXT_texture_filter_anisotropic); -EXTRA_EXT(NV_point_sprite); EXTRA_EXT(NV_texture_rectangle); EXTRA_EXT(EXT_stencil_two_side); EXTRA_EXT(EXT_depth_bounds_test); @@ -516,7 +515,7 @@ EXTRA_EXT(EXT_transform_feedback); EXTRA_EXT(ARB_transform_feedback3); EXTRA_EXT(EXT_pixel_buffer_object); EXTRA_EXT(ARB_vertex_program); -EXTRA_EXT2(NV_point_sprite, ARB_point_sprite); +EXTRA_EXT(ARB_point_sprite); EXTRA_EXT2(ARB_vertex_program, ARB_fragment_program); EXTRA_EXT(ARB_color_buffer_float); EXTRA_EXT(EXT_framebuffer_sRGB); diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py index d9c0984f0ba..eb0170f4291 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -247,7 +247,7 @@ descriptor=[ [ "TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB", "LOC_CUSTOM, TYPE_INT, NO_OFFSET, NO_EXTRA" ], # GL_OES_point_sprite - [ "POINT_SPRITE_NV", "CONTEXT_BOOL(Point.PointSprite), extra_NV_point_sprite_ARB_point_sprite" ], + [ "POINT_SPRITE", "CONTEXT_BOOL(Point.PointSprite), extra_ARB_point_sprite" ], ]}, @@ -867,9 +867,8 @@ descriptor=[ # GL_IBM_rasterpos_clip [ "RASTER_POSITION_UNCLIPPED_IBM", "CONTEXT_BOOL(Transform.RasterPositionUnclipped), NO_EXTRA" ], -# GL_NV_point_sprite - [ "POINT_SPRITE_R_MODE_NV", "CONTEXT_ENUM16(Point.SpriteRMode), extra_NV_point_sprite" ], - [ "POINT_SPRITE_COORD_ORIGIN", "CONTEXT_ENUM16(Point.SpriteOrigin), extra_NV_point_sprite_ARB_point_sprite" ], +# GL_ARB_point_sprite + [ "POINT_SPRITE_COORD_ORIGIN", "CONTEXT_ENUM16(Point.SpriteOrigin), extra_ARB_point_sprite" ], # GL_NV_texture_rectangle [ "TEXTURE_RECTANGLE_NV", "LOC_CUSTOM, TYPE_BOOLEAN, 0, extra_NV_texture_rectangle" ], diff --git a/src/mesa/main/glthread_marshal.h b/src/mesa/main/glthread_marshal.h index 94bfff1e3cb..2680530a10f 100644 --- a/src/mesa/main/glthread_marshal.h +++ b/src/mesa/main/glthread_marshal.h @@ -259,7 +259,7 @@ _mesa_texenv_enum_to_count(GLenum pname) case GL_RGB_SCALE: case GL_ALPHA_SCALE: case GL_TEXTURE_LOD_BIAS_EXT: - case GL_COORD_REPLACE_NV: + case GL_COORD_REPLACE: return 1; case GL_TEXTURE_ENV_COLOR: return 4; @@ -310,7 +310,6 @@ _mesa_point_param_enum_to_count(GLenum pname) case GL_POINT_SIZE_MIN_EXT: case GL_POINT_SIZE_MAX_EXT: case GL_POINT_FADE_THRESHOLD_SIZE_EXT: - case GL_POINT_SPRITE_R_MODE_NV: case GL_POINT_SPRITE_COORD_ORIGIN: return 1; default: diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index bf3c6395853..b93991968f5 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -782,7 +782,6 @@ struct gl_point_attrib GLboolean _Attenuated; /**< True if Params != [1, 0, 0] */ GLboolean PointSprite; /**< GL_NV/ARB_point_sprite */ GLbitfield CoordReplace; /**< GL_ARB_point_sprite*/ - GLenum16 SpriteRMode; /**< GL_NV_point_sprite (only!) */ GLenum16 SpriteOrigin; /**< GL_ARB_point_sprite */ }; @@ -4495,7 +4494,6 @@ struct gl_extensions GLboolean NV_copy_image; GLboolean NV_fill_rectangle; GLboolean NV_fog_distance; - GLboolean NV_point_sprite; GLboolean NV_primitive_restart; GLboolean NV_shader_atomic_float; GLboolean NV_shader_atomic_int64; @@ -5023,7 +5021,7 @@ struct gl_enable_attrib_node /* GL_ARB_fragment_program */ GLboolean FragmentProgram; - /* GL_ARB_point_sprite / GL_NV_point_sprite */ + /* GL_ARB_point_sprite */ GLboolean PointSprite; GLboolean FragmentShaderATI; diff --git a/src/mesa/main/points.c b/src/mesa/main/points.c index 095e2a3d707..10b2ab16514 100644 --- a/src/mesa/main/points.c +++ b/src/mesa/main/points.c @@ -117,9 +117,8 @@ _mesa_PointParameterfv( GLenum pname, const GLfloat *params) * If point parameters aren't supported, then this function shouldn't even * exist. */ - assert(!(ctx->Extensions.ARB_point_sprite - || ctx->Extensions.NV_point_sprite) - || ctx->Extensions.EXT_point_parameters); + assert(!ctx->Extensions.ARB_point_sprite || + ctx->Extensions.EXT_point_parameters); if (!ctx->Extensions.EXT_point_parameters) { _mesa_error(ctx, GL_INVALID_OPERATION, @@ -170,29 +169,6 @@ _mesa_PointParameterfv( GLenum pname, const GLfloat *params) FLUSH_VERTICES(ctx, _NEW_POINT); ctx->Point.Threshold = params[0]; break; - case GL_POINT_SPRITE_R_MODE_NV: - /* This is one area where ARB_point_sprite and NV_point_sprite - * differ. In ARB_point_sprite the POINT_SPRITE_R_MODE is - * always ZERO. NV_point_sprite adds the S and R modes. - */ - if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_point_sprite) { - GLenum value = (GLenum) params[0]; - if (value != GL_ZERO && value != GL_S && value != GL_R) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glPointParameterf[v]{EXT,ARB}(param)"); - return; - } - if (ctx->Point.SpriteRMode == value) - return; - FLUSH_VERTICES(ctx, _NEW_POINT); - ctx->Point.SpriteRMode = value; - } - else { - _mesa_error(ctx, GL_INVALID_ENUM, - "glPointParameterf[v]{EXT,ARB}(pname)"); - return; - } - break; case GL_POINT_SPRITE_COORD_ORIGIN: /* GL_POINT_SPRITE_COORD_ORIGIN was added to point sprites when the * extension was merged into OpenGL 2.0. @@ -263,7 +239,6 @@ _mesa_init_point(struct gl_context *ctx) ctx->Point.PointSprite = (ctx->API == API_OPENGL_CORE || ctx->API == API_OPENGLES2); - ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite (only!) */ ctx->Point.SpriteOrigin = GL_UPPER_LEFT; /* GL_ARB_point_sprite */ - ctx->Point.CoordReplace = 0; /* GL_ARB/NV_point_sprite */ + ctx->Point.CoordReplace = 0; /* GL_ARB_point_sprite */ } diff --git a/src/mesa/main/texenv.c b/src/mesa/main/texenv.c index 0825e220a21..5f6a4abe2b9 100644 --- a/src/mesa/main/texenv.c +++ b/src/mesa/main/texenv.c @@ -398,7 +398,7 @@ _mesa_texenvfv_indexed( struct gl_context* ctx, GLuint texunit, GLenum target, const GLint iparam0 = (GLint) param[0]; GLuint maxUnit; - maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) + maxUnit = (target == GL_POINT_SPRITE && pname == GL_COORD_REPLACE) ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; if (texunit >= maxUnit) { _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(texunit=%d)", texunit); @@ -477,14 +477,13 @@ _mesa_texenvfv_indexed( struct gl_context* ctx, GLuint texunit, GLenum target, return; } } - else if (target == GL_POINT_SPRITE_NV) { - /* GL_ARB_point_sprite / GL_NV_point_sprite */ - if (!ctx->Extensions.NV_point_sprite - && !ctx->Extensions.ARB_point_sprite) { + else if (target == GL_POINT_SPRITE) { + /* GL_ARB_point_sprite */ + if (!ctx->Extensions.ARB_point_sprite) { _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); return; } - if (pname == GL_COORD_REPLACE_NV) { + if (pname == GL_COORD_REPLACE) { /* It's kind of weird to set point state via glTexEnv, * but that's what the spec calls for. */ @@ -720,7 +719,7 @@ _mesa_gettexenvfv_indexed( GLuint texunit, GLenum target, GLenum pname, GLfloat GLuint maxUnit; GET_CURRENT_CONTEXT(ctx); - maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) + maxUnit = (target == GL_POINT_SPRITE && pname == GL_COORD_REPLACE) ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; if (texunit >= maxUnit) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(texunit=%d)", texunit); @@ -764,14 +763,13 @@ _mesa_gettexenvfv_indexed( GLuint texunit, GLenum target, GLenum pname, GLfloat return; } } - else if (target == GL_POINT_SPRITE_NV) { - /* GL_ARB_point_sprite / GL_NV_point_sprite */ - if (!ctx->Extensions.NV_point_sprite - && !ctx->Extensions.ARB_point_sprite) { + else if (target == GL_POINT_SPRITE) { + /* GL_ARB_point_sprite */ + if (!ctx->Extensions.ARB_point_sprite) { _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); return; } - if (pname == GL_COORD_REPLACE_NV) { + if (pname == GL_COORD_REPLACE) { if (ctx->Point.CoordReplace & (1u << texunit)) *params = 1.0f; else @@ -796,7 +794,7 @@ _mesa_gettexenviv_indexed( GLuint texunit, GLenum target, GLuint maxUnit; GET_CURRENT_CONTEXT(ctx); - maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) + maxUnit = (target == GL_POINT_SPRITE && pname == GL_COORD_REPLACE) ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; if (texunit >= maxUnit) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(texunit=%d)", @@ -841,14 +839,13 @@ _mesa_gettexenviv_indexed( GLuint texunit, GLenum target, return; } } - else if (target == GL_POINT_SPRITE_NV) { - /* GL_ARB_point_sprite / GL_NV_point_sprite */ - if (!ctx->Extensions.NV_point_sprite - && !ctx->Extensions.ARB_point_sprite) { + else if (target == GL_POINT_SPRITE) { + /* GL_ARB_point_sprite */ + if (!ctx->Extensions.ARB_point_sprite) { _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); return; } - if (pname == GL_COORD_REPLACE_NV) { + if (pname == GL_COORD_REPLACE) { if (ctx->Point.CoordReplace & (1u << texunit)) *params = GL_TRUE; else diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 75b23ad2c7a..a9037a438dc 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -820,8 +820,6 @@ void st_init_extensions(struct pipe_screen *screen, { o(NV_viewport_array2), PIPE_CAP_VIEWPORT_MASK }, { o(NV_viewport_swizzle), PIPE_CAP_VIEWPORT_SWIZZLE }, { o(NVX_gpu_memory_info), PIPE_CAP_QUERY_MEMORY_INFO }, - /* GL_NV_point_sprite is not supported by gallium because we don't - * support the GL_POINT_SPRITE_R_MODE_NV option. */ { o(OES_standard_derivatives), PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES }, { o(OES_texture_float_linear), PIPE_CAP_TEXTURE_FLOAT_LINEAR }, diff --git a/src/mesa/swrast/s_points.c b/src/mesa/swrast/s_points.c index 1c6c239042a..04c85b3b74c 100644 --- a/src/mesa/swrast/s_points.c +++ b/src/mesa/swrast/s_points.c @@ -120,7 +120,7 @@ sprite_point(struct gl_context *ctx, const SWvertex *vert) span.attrStepY[VARYING_SLOT_POS][3] = 0.0F; { - GLfloat s, r, dsdx; + GLfloat s, dsdx; /* texcoord / pointcoord interpolants */ s = 0.0F; @@ -143,16 +143,9 @@ sprite_point(struct gl_context *ctx, const SWvertex *vert) if (ctx->Point.CoordReplace & (1u << u)) { tCoords[numTcoords++] = attr; - if (ctx->Point.SpriteRMode == GL_ZERO) - r = 0.0F; - else if (ctx->Point.SpriteRMode == GL_S) - r = vert->attrib[attr][0]; - else /* GL_R */ - r = vert->attrib[attr][2]; - span.attrStart[attr][0] = s; span.attrStart[attr][1] = 0.0; /* overwritten below */ - span.attrStart[attr][2] = r; + span.attrStart[attr][2] = 0.0; span.attrStart[attr][3] = 1.0; span.attrStepX[attr][0] = dsdx;