Index: trunk/nv/gl/gl_context.hh
===================================================================
--- trunk/nv/gl/gl_context.hh	(revision 232)
+++ trunk/nv/gl/gl_context.hh	(revision 233)
@@ -40,4 +40,5 @@
 		void apply_blending( const blending& blend );
 		void apply_culling( const culling& cull );
+		void apply_polygon_mode( const polygon_mode& mode );
 		void enable( unsigned int what, bool value );
 
Index: trunk/nv/gl/gl_enum.hh
===================================================================
--- trunk/nv/gl/gl_enum.hh	(revision 232)
+++ trunk/nv/gl/gl_enum.hh	(revision 233)
@@ -25,4 +25,5 @@
 	unsigned int clear_state_buffers_to_mask( clear_state::buffers_type type );
 	unsigned int depth_state_function_to_enum( depth_test::function_type type );
+	unsigned int polygon_mode_fill_to_enum( polygon_mode::fill_type type );
 	unsigned int blending_factor_to_enum( blending::factor type );
 	unsigned int blending_equation_to_enum( blending::equation type );
Index: trunk/nv/interface/render_state.hh
===================================================================
--- trunk/nv/interface/render_state.hh	(revision 232)
+++ trunk/nv/interface/render_state.hh	(revision 233)
@@ -39,4 +39,18 @@
 
 		depth_test() : enabled( true ), function( LESS ) {}
+	};
+
+	struct polygon_mode
+	{
+		enum fill_type
+		{
+			POINT,
+			LINE,
+			FILL
+		};
+
+		fill_type fill;
+
+		polygon_mode() : fill( FILL ) {}
 	};
 
@@ -183,4 +197,5 @@
 		nv::culling      culling;
 		nv::color_mask   color_mask;
+		nv::polygon_mode polygon_mode;
 		bool depth_mask;
 	};
Index: trunk/src/gl/gl_context.cc
===================================================================
--- trunk/src/gl/gl_context.cc	(revision 232)
+++ trunk/src/gl/gl_context.cc	(revision 233)
@@ -171,4 +171,14 @@
 }
 
+void gl_context::apply_polygon_mode( const polygon_mode& mode )
+{
+	if ( m_render_state.polygon_mode.fill != mode.fill )
+	{
+		glPolygonMode( GL_FRONT_AND_BACK, polygon_mode_fill_to_enum( mode.fill ) );
+		m_render_state.polygon_mode.fill = mode.fill;
+	}
+}
+
+
 void gl_context::apply_depth_range( const depth_range& range )
 {
@@ -316,4 +326,5 @@
 		state.color_mask.blue, state.color_mask.alpha 
 	);
+	glPolygonMode( GL_FRONT_AND_BACK, polygon_mode_fill_to_enum( state.polygon_mode.fill ) );
 }
 
@@ -347,4 +358,5 @@
 	apply_color_mask( state.color_mask );
 	apply_depth_mask( state.depth_mask );
+	apply_polygon_mode( state.polygon_mode );
 }
 
Index: trunk/src/gl/gl_enum.cc
===================================================================
--- trunk/src/gl/gl_enum.cc	(revision 232)
+++ trunk/src/gl/gl_enum.cc	(revision 233)
@@ -33,4 +33,17 @@
 	}
 }
+
+unsigned int nv::polygon_mode_fill_to_enum( polygon_mode::fill_type type )
+{
+	switch( type )
+	{
+	case polygon_mode::FILL           : return GL_FILL;
+	case polygon_mode::LINE           : return GL_LINE;
+	case polygon_mode::POINT          : return GL_POINT;
+	NV_RETURN_COVERED_DEFAULT( 0 );
+	}
+}
+
+
 
 unsigned int nv::blending_factor_to_enum( blending::factor type )
