Index: /trunk/nv/gl/gl_context.hh
===================================================================
--- /trunk/nv/gl/gl_context.hh	(revision 341)
+++ /trunk/nv/gl/gl_context.hh	(revision 342)
@@ -36,5 +36,5 @@
 		virtual const framebuffer_info* get_framebuffer_info( framebuffer f ) const;
 
-		virtual void set_draw_buffers( uint32 count, output_slot* slots );
+		virtual void set_draw_buffers( uint32 count, const output_slot* slots );
 		virtual void set_draw_buffer( output_slot slot );
 		virtual void set_read_buffer( output_slot slot );
Index: /trunk/nv/interface/camera.hh
===================================================================
--- /trunk/nv/interface/camera.hh	(revision 341)
+++ /trunk/nv/interface/camera.hh	(revision 342)
@@ -70,5 +70,6 @@
 		void set_camera( const camera& c ) { m_camera = c; }
 		void set_model( const mat4& m )    { m_model  = m; } 
-
+		void set_viewport( const ivec4& v ){ m_viewport = v; }
+		const ivec4& get_viewport()  const { return m_viewport; }
 		const mat4& get_model()      const { return m_model; }
 		const mat4& get_view()       const { return m_camera.get_view(); }
@@ -83,4 +84,5 @@
 		mat4   m_model;
 		camera m_camera; 
+		ivec4  m_viewport;
 	};
 
Index: /trunk/nv/interface/clear_state.hh
===================================================================
--- /trunk/nv/interface/clear_state.hh	(revision 341)
+++ /trunk/nv/interface/clear_state.hh	(revision 342)
@@ -57,4 +57,5 @@
 		enum buffers_type
 		{
+			NONE = 0,
 			COLOR_BUFFER = 1,
 			DEPTH_BUFFER = 2,
Index: /trunk/nv/interface/context.hh
===================================================================
--- /trunk/nv/interface/context.hh	(revision 341)
+++ /trunk/nv/interface/context.hh	(revision 342)
@@ -89,5 +89,5 @@
 		virtual const framebuffer_info* get_framebuffer_info( framebuffer ) const = 0;
 
-		virtual void set_draw_buffers( uint32 count, output_slot* slots ) = 0;
+		virtual void set_draw_buffers( uint32 count, const output_slot* slots ) = 0;
 		virtual void set_draw_buffer( output_slot slot ) = 0;
 		virtual void set_read_buffer( output_slot slot ) = 0;
Index: /trunk/nv/interface/device.hh
===================================================================
--- /trunk/nv/interface/device.hh	(revision 341)
+++ /trunk/nv/interface/device.hh	(revision 342)
@@ -265,4 +265,6 @@
 			factory_map[ "nv_v_camera_position" ]  = new engine_uniform_factory< engine_uniform_v_camera_position >();
 			factory_map[ "nv_v_camera_direction" ] = new engine_uniform_factory< engine_uniform_v_camera_direction >();
+			factory_map[ "nv_v_viewport" ] = new engine_uniform_factory< engine_uniform_v_viewport >();
+			factory_map[ "nv_v_screen_size" ] = new engine_uniform_factory< engine_uniform_v_screen_size >();
 
 			engine_link_uniform_factory_map& factory_link_map = get_link_uniform_factory();
Index: /trunk/nv/interface/uniform.hh
===================================================================
--- /trunk/nv/interface/uniform.hh	(revision 341)
+++ /trunk/nv/interface/uniform.hh	(revision 342)
@@ -223,4 +223,19 @@
 	};
 
+	class engine_uniform_v_viewport : public engine_uniform< ivec4 >
+	{
+	public:
+		engine_uniform_v_viewport( uniform_base* u ) : engine_uniform( u ) {}
+		virtual void set( const context* , const scene_state* s ) { m_uniform->set_value( s->get_viewport() ); }
+	};
+
+	class engine_uniform_v_screen_size : public engine_uniform< ivec2 >
+	{
+	public:
+		engine_uniform_v_screen_size( uniform_base* u ) : engine_uniform( u ) {}
+		virtual void set( const context* , const scene_state* s ) { m_uniform->set_value( nv::ivec2( s->get_viewport().z, s->get_viewport().w ) ); }
+	};
+
+
 	template< int VALUE >
 	class engine_link_uniform_int : public engine_link_uniform< int >
Index: /trunk/src/gl/gl_context.cc
===================================================================
--- /trunk/src/gl/gl_context.cc	(revision 341)
+++ /trunk/src/gl/gl_context.cc	(revision 342)
@@ -719,6 +719,12 @@
 }
 
-void nv::gl_context::set_draw_buffers( uint32 count, output_slot* slots )
-{
+void nv::gl_context::set_draw_buffers( uint32 count, const output_slot* slots )
+{
+	if ( count == 0 ) return;
+	if ( count == 1 )
+	{
+		set_draw_buffer( slots[0] );
+		return;
+	}
 	unsigned int buffers[8];
 	count = glm::min<uint32>( count, 8 );
