diff options
Diffstat (limited to 'src/mesa/pipe/i915simple/i915_context.c')
-rw-r--r-- | src/mesa/pipe/i915simple/i915_context.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/mesa/pipe/i915simple/i915_context.c b/src/mesa/pipe/i915simple/i915_context.c new file mode 100644 index 0000000000..1a21e931ae --- /dev/null +++ b/src/mesa/pipe/i915simple/i915_context.c @@ -0,0 +1,180 @@ +/************************************************************************** + * + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#include "main/imports.h" /* CALLOC */ +#include "i915_context.h" +#include "i915_winsys.h" +#include "i915_state.h" + +#include "pipe/draw/draw_context.h" +#include "pipe/p_defines.h" + + + +/** + * Return list of supported surface/texture formats. + * If we find texture and drawable support differs, add a selector + * parameter or another function. + */ +static const GLuint * +i915_supported_formats(struct pipe_context *pipe, +// GLuint type, + GLuint *numFormats) +{ +#if 0 + static const GLuint tex_supported[] = { + PIPE_FORMAT_U_R8_G8_B8_A8, + PIPE_FORMAT_U_A8_R8_G8_B8, + PIPE_FORMAT_U_R5_G6_B5, + PIPE_FORMAT_U_L8, + PIPE_FORMAT_U_A8, + PIPE_FORMAT_U_I8, + PIPE_FORMAT_U_L8_A8, + PIPE_FORMAT_YCBCR, + PIPE_FORMAT_YCBCR_REV, + PIPE_FORMAT_S8_Z24, + }; + + + /* Actually a lot more than this - add later: + */ + static const GLuint render_supported[] = { + PIPE_FORMAT_U_A8_R8_G8_B8, + PIPE_FORMAT_U_R5_G6_B5, + }; + + /* + */ + static const GLuint z_stencil_supported[] = { + PIPE_FORMAT_U_Z16, + PIPE_FORMAT_U_Z32, + PIPE_FORMAT_S8_Z24, + }; + + switch (type) { + case PIPE_RENDER_FORMAT: + *numFormats = Elements(render_supported); + return render_supported; + + case PIPE_TEX_FORMAT: + *numFormats = Elements(tex_supported); + return render_supported; + + case PIPE_Z_STENCIL_FORMAT: + *numFormats = Elements(render_supported); + return render_supported; + + default: + *numFormats = 0; + return NULL; + } +#else + static const GLuint render_supported[] = { + PIPE_FORMAT_U_A8_R8_G8_B8, + PIPE_FORMAT_U_R5_G6_B5, + PIPE_FORMAT_S8_Z24, + }; + *numFormats = 2; + return render_supported; +#endif +} + + + +static void i915_destroy( struct pipe_context *pipe ) +{ + struct i915_context *i915 = i915_context( pipe ); + + draw_destroy( i915->draw ); + + free( i915 ); +} + +static void i915_draw_vb( struct pipe_context *pipe, + struct vertex_buffer *VB ) +{ + struct i915_context *i915 = i915_context( pipe ); + +// if (i915->dirty) +// i915_update_derived( i915 ); + + draw_vb( i915->draw, VB ); +} + + +static void +i915_draw_vertices(struct pipe_context *pipe, + GLuint mode, + GLuint numVertex, const GLfloat *verts, + GLuint numAttribs, const GLuint attribs[]) +{ + struct i915_context *i915 = i915_context( pipe ); + + if (i915->dirty) + i915_update_derived( i915 ); + + draw_vertices(i915->draw, mode, numVertex, verts, numAttribs, attribs); +} + + + + +struct pipe_context *i915_create( struct i915_winsys *winsys ) +{ + struct i915_context *i915 = CALLOC_STRUCT(i915_context); + + i915->pipe.destroy = i915_destroy; + + i915->pipe.supported_formats = i915_supported_formats; + + i915->pipe.draw_vb = i915_draw_vb; + i915->pipe.draw_vertices = i915_draw_vertices; + i915->pipe.clear = i915_clear; + i915->pipe.reset_occlusion_counter = NULL; /* no support */ + i915->pipe.get_occlusion_counter = NULL; + + i915->winsys = winsys; + + /* + * Create drawing context and plug our rendering stage into it. + */ + i915->draw = draw_create(); + assert(i915->draw); + draw_set_setup_stage(i915->draw, i915_draw_render_stage(i915)); + + i915_init_buffer_functions(i915); + i915_init_region_functions(i915); + i915_init_surface_functions(i915); + + /* + * XXX we could plug GL selection/feedback into the drawing pipeline + * by specifying a different setup/render stage. + */ + + return &i915->pipe; +} + |