Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / mesa / drivers / dri / r600 / r600_context.c
index fddac2f9bdc8011c887c954acb254e8308ca0ab5..c882a9cce9e6be57b07be23c49e391ba0d346a52 100644 (file)
@@ -43,6 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "main/extensions.h"
 #include "main/bufferobj.h"
 #include "main/texobj.h"
+#include "main/points.h"
 
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
@@ -59,7 +60,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "radeon_buffer_objects.h"
 #include "radeon_span.h"
 #include "r600_cmdbuf.h"
-#include "r600_emit.h"
 #include "radeon_bocs_wrapper.h"
 #include "radeon_queryobj.h"
 #include "r600_blit.h"
@@ -67,12 +67,19 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r700_state.h"
 #include "r700_ioctl.h"
 
+#include "evergreen_context.h"
+#include "evergreen_state.h"
+#include "evergreen_tex.h"
+#include "evergreen_ioctl.h"
+#include "evergreen_oglprog.h"
 
 #include "utils.h"
 
 #define R600_ENABLE_GLSL_TEST 1
 
 #define need_GL_VERSION_2_0
+#define need_GL_VERSION_2_1
+#define need_GL_ARB_draw_elements_base_vertex
 #define need_GL_ARB_occlusion_query
 #define need_GL_ARB_point_parameters
 #define need_GL_ARB_vertex_program
@@ -139,8 +146,8 @@ static const struct dri_extension card_extensions[] = {
   {"GL_MESAX_texture_float",           NULL},
   {"GL_NV_blend_square",               NULL},
   {"GL_NV_vertex_program",             GL_NV_vertex_program_functions},
-  {"GL_SGIS_generate_mipmap",          NULL},
   {"GL_ARB_pixel_buffer_object",        NULL},
+  {"GL_ARB_draw_elements_base_vertex", GL_ARB_draw_elements_base_vertex_functions },
   {NULL,                               NULL}
   /* *INDENT-ON* */
 };
@@ -201,7 +208,7 @@ static void r600_vtbl_pre_emit_atoms(radeonContextPtr radeon)
        r700Start3D((context_t *)radeon);
 }
 
-static void r600_fallback(GLcontext *ctx, GLuint bit, GLboolean mode)
+static void r600_fallback(struct gl_context *ctx, GLuint bit, GLboolean mode)
 {
        context_t *context = R700_CONTEXT(ctx);
        if (mode)
@@ -219,7 +226,7 @@ static void r600_emit_query_finish(radeonContextPtr radeon)
 
        BEGIN_BATCH_NO_AUTOSTATE(4 + 2);
        R600_OUT_BATCH(CP_PACKET3(R600_IT_EVENT_WRITE, 2));
-       R600_OUT_BATCH(ZPASS_DONE);
+       R600_OUT_BATCH(R600_EVENT_TYPE(ZPASS_DONE) | R600_EVENT_INDEX(1));
        R600_OUT_BATCH(query->curr_offset + 8); /* hw writes qwords */
        R600_OUT_BATCH(0x00000000);
        R600_OUT_BATCH_RELOC(VGT_EVENT_INITIATOR, query->bo, 0, 0, RADEON_GEM_DOMAIN_GTT, 0);
@@ -239,11 +246,26 @@ static void r600_init_vtbl(radeonContextPtr radeon)
        radeon->vtbl.emit_query_finish = r600_emit_query_finish;
        radeon->vtbl.check_blit = r600_check_blit;
        radeon->vtbl.blit = r600_blit;
-       radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;
+       radeon->vtbl.is_format_renderable = r600IsFormatRenderable;
 }
 
-static void r600InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
+static void r600InitConstValues(struct gl_context *ctx, radeonScreenPtr screen)
 {
+    context_t         *context = R700_CONTEXT(ctx);
+    R700_CHIP_CONTEXT *r700    = (R700_CHIP_CONTEXT*)(&context->hw);
+
+    if(  (context->radeon.radeonScreen->chip_family >= CHIP_FAMILY_CEDAR)
+       &&(context->radeon.radeonScreen->chip_family <= CHIP_FAMILY_HEMLOCK) )
+    {
+        r700->bShaderUseMemConstant = GL_TRUE;
+    }
+    else
+    {
+        r700->bShaderUseMemConstant = GL_FALSE;
+    }
+
+        ctx->Const.GLSLVersion = 120;
+
        ctx->Const.MaxTextureImageUnits = 16;
        /* 8 per clause on r6xx, 16 on r7xx
         * but I think mesa only supports 8 at the moment
@@ -313,9 +335,12 @@ static void r600ParseOptions(context_t *r600, radeonScreenPtr screen)
 
 }
 
-static void r600InitGLExtensions(GLcontext *ctx)
+static void r600InitGLExtensions(struct gl_context *ctx)
 {
        context_t *r600 = R700_CONTEXT(ctx);
+#ifdef R600_ENABLE_GLSL_TEST
+       unsigned i;
+#endif
 
        driInitExtensions(ctx, card_extensions, GL_TRUE);
        if (r600->radeon.radeonScreen->kernel_mm)
@@ -325,8 +350,9 @@ static void r600InitGLExtensions(GLcontext *ctx)
     driInitExtensions(ctx, gl_20_extension, GL_TRUE);
     _mesa_enable_2_0_extensions(ctx);
     
-    /* glsl compiler has problem if this is not GL_TRUE */
-    ctx->Shader.EmitCondCodes = GL_TRUE;
+       /* glsl compiler has problem if this is not GL_TRUE */
+       for (i = 0; i <= MESA_SHADER_FRAGMENT; i++)
+               ctx->ShaderCompilerOptions[i].EmitCondCodes = GL_TRUE;
 #endif /* R600_ENABLE_GLSL_TEST */
 
        if (driQueryOptionb
@@ -353,7 +379,8 @@ static void r600InitGLExtensions(GLcontext *ctx)
 
 /* Create the device specific rendering context.
  */
-GLboolean r600CreateContext(const __GLcontextModes * glVisual,
+GLboolean r600CreateContext(gl_api api,
+                           const struct gl_config * glVisual,
                            __DRIcontext * driContextPriv,
                            void *sharedContextPrivate)
 {
@@ -361,7 +388,7 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,
        radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
        struct dd_function_table functions;
        context_t *r600;
-       GLcontext *ctx;
+       struct gl_context *ctx;
 
        assert(glVisual);
        assert(driContextPriv);
@@ -377,18 +404,45 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,
        r600ParseOptions(r600, screen);
 
        r600->radeon.radeonScreen = screen;
-       r600_init_vtbl(&r600->radeon);
 
+    if(screen->chip_family >= CHIP_FAMILY_CEDAR)
+    {
+           evergreen_init_vtbl(&r600->radeon);
+    }
+    else
+    {
+        r600_init_vtbl(&r600->radeon);
+    }
+    
        /* Init default driver functions then plug in our R600-specific functions
         * (the texture functions are especially important)
         */
        _mesa_init_driver_functions(&functions);
 
-       r700InitStateFuncs(&r600->radeon, &functions);
-       r600InitTextureFuncs(&r600->radeon, &functions);
-       r700InitShaderFuncs(&functions);
+    if(screen->chip_family >= CHIP_FAMILY_CEDAR)
+    {
+        evergreenCreateChip(r600);
+        evergreenInitStateFuncs(&r600->radeon, &functions);
+           evergreenInitTextureFuncs(&r600->radeon, &functions);
+           evergreenInitShaderFuncs(&functions);
+    }
+    else
+    {
+           r700InitStateFuncs(&r600->radeon, &functions);
+           r600InitTextureFuncs(&r600->radeon, &functions);
+           r700InitShaderFuncs(&functions);
+    }
+    
        radeonInitQueryObjFunctions(&functions);
-       r700InitIoctlFuncs(&functions);
+
+    if(screen->chip_family >= CHIP_FAMILY_CEDAR)
+    {
+        evergreenInitIoctlFuncs(&functions);
+    }
+    else
+    {
+           r700InitIoctlFuncs(&functions);
+    }
        radeonInitBufferObjectFuncs(&functions);
 
        if (!radeonInitContext(&r600->radeon, &functions,
@@ -406,6 +460,9 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,
 
        r600InitConstValues(ctx, screen);
 
+       /* reinit, it depends on consts above */
+       _mesa_init_point(ctx);
+
        _mesa_set_mvp_with_dp4( ctx, GL_TRUE );
 
        /* Initialize the software rasterizer and helper modules.
@@ -431,16 +488,46 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,
 
        radeon_init_debug();
 
-       r700InitDraw(ctx);
+    if(screen->chip_family >= CHIP_FAMILY_CEDAR)
+    {
+        evergreenInitDraw(ctx);
+    }
+    else
+    {
+           r700InitDraw(ctx);
+    }
 
        radeon_fbo_init(&r600->radeon);
        radeonInitSpanFuncs( ctx );
        r600InitCmdBuf(r600);
-       r700InitState(r600->radeon.glCtx);
+
+    if(screen->chip_family >= CHIP_FAMILY_CEDAR)
+    {
+        evergreenInitState(r600->radeon.glCtx);
+    }
+    else
+    {
+           r700InitState(r600->radeon.glCtx);
+    }
 
        r600InitGLExtensions(ctx);
 
        return GL_TRUE;
 }
 
+void r600DestroyContext(__DRIcontext *driContextPriv )
+{
+    void      *pChip;
+    context_t *context = (context_t *) driContextPriv->driverPrivate;
+
+    assert(context);
+
+    pChip = context->pChip;
+
+    /* destroy context first, free pChip, in case there are things flush to asic. */
+    radeonDestroyContext(driContextPriv);
+
+    FREE(pChip);
+}
+