intel: Support GLSL compiling in less intrusive way

Removed all the extension semantics. Support for compiling GLSL in the
driver is intended to be a tempory feature and these changes minimize
the impact on the driver and make it easier to remove in the future.
diff --git a/icd/intel/compiler/shader/compiler_interface.cpp b/icd/intel/compiler/shader/compiler_interface.cpp
index e8070a1..3e1ea99 100644
--- a/icd/intel/compiler/shader/compiler_interface.cpp
+++ b/icd/intel/compiler/shader/compiler_interface.cpp
@@ -242,13 +242,18 @@
 
 // invoke front end compiler to generate an independently linked
 // program object that contains Mesa HIR
-struct gl_shader_program *shader_create_program_bil(struct intel_shader *sh,
-                                                    const icd_bil_header *bil,
+struct gl_shader_program *shader_create_program(struct intel_shader *sh,
+                                                    const void *code,
                                                     XGL_SIZE size)
 {
+    struct icd_bil_header header;
     struct gl_context local_ctx;
     struct gl_context *ctx = &local_ctx;
 
+    memcpy(&header, code, sizeof(header));
+    if (header.magic != ICD_BIL_MAGIC)
+        return NULL;
+
     _mesa_create_shader_compiler();
     initialize_mesa_context_to_defaults(ctx);
 
@@ -266,116 +271,55 @@
     shader_program->Shaders[shader_program->NumShaders] = shader;
     shader_program->NumShaders++;
 
-    shader->Source = (const GLchar*)bil;
-    shader->Size   = size / sizeof(unsigned);  // size in BIL words
+    if (header.version == 0) {
+        // version 0 means we really have GLSL Source
+        shader->Source = (const char *) code + sizeof(header);
 
-    glbil::ExecutionModel executionModel = glbil::ModelVertex;
-
-    unsigned bilWord = 5;
-
-    while (bilWord < size) {
-        const unsigned      opWord = ((unsigned int*)bil)[bilWord];
-        const glbil::OpCode op     = glbil::OpCode((opWord & 0xffff));
-
-        if (op == glbil::OpEntryPoint) {
-            executionModel = glbil::ExecutionModel(((unsigned int*)bil)[bilWord+1]);
+        switch(header.gen_magic) {
+        case XGL_SHADER_STAGE_VERTEX:
+            shader->Type = GL_VERTEX_SHADER;
+            break;
+        case XGL_SHADER_STAGE_FRAGMENT:
+            shader->Type = GL_FRAGMENT_SHADER;
+            break;
+        default:
+            assert(0);
             break;
         }
+    } else {
 
-        bilWord += (opWord & 0xffff0000) >> 16;
-    }
+        shader->Source = (const GLchar*)code;
+        shader->Size   = size / sizeof(unsigned);  // size in BIL words
 
-    // We should parse the glsl text out of bil right now, but
-    // instead we are just plopping down our glsl
-    switch(executionModel) {
-    case glbil::ModelVertex:
-        shader->Type = GL_VERTEX_SHADER;
-        break;
-    case glbil::ModelFragment:
-        shader->Type = GL_FRAGMENT_SHADER;
-        break;
-    default:
-        assert(0);
-        break;
-    }
+        glbil::ExecutionModel executionModel = glbil::ModelVertex;
 
-    shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type);
+        unsigned bilWord = 5;
 
-    struct _mesa_glsl_parse_state *state =
-        new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
+        while (bilWord < size) {
+            const unsigned      opWord = ((unsigned int*)code)[bilWord];
+            const glbil::OpCode op     = glbil::OpCode((opWord & 0xffff));
 
-    shader_program->Type = shader->Stage;
+            if (op == glbil::OpEntryPoint) {
+                executionModel = glbil::ExecutionModel(((unsigned int*)code)[bilWord+1]);
+                break;
+            }
 
-    bool dump_ast = false;
-    bool dump_hir = true;
-    bool do_link  = true;
+            bilWord += (opWord & 0xffff0000) >> 16;
+        }
 
-    _mesa_glsl_compile_shader(ctx, shader, dump_ast, dump_hir);
-
-    if (strlen(shader->InfoLog) > 0)
-        printf("Info log:\n%s\n", shader->InfoLog);
-
-    if (!shader->CompileStatus)
-        return NULL;
-
-    assert(shader_program->NumShaders == 1);
-
-    // for XGL, we are independently compiling and linking individual
-    // shaders, which matches this frontend's concept of SSO
-    shader_program->SeparateShader = true;
-
-    link_shaders(ctx, shader_program);
-    if (!shader_program->LinkStatus)
-        return NULL;
-
-    if (strlen(shader_program->InfoLog) > 0)
-        printf("Info log for linking:\n%s\n", shader_program->InfoLog);
-
-    _mesa_destroy_shader_compiler();
-
-    return shader_program;
-}
-
-
-// invoke front end compiler to generate an independently linked
-// program object that contains Mesa HIR
-struct gl_shader_program *shader_create_program_glsl(struct intel_shader *sh,
-                                                     const XGL_INTEL_COMPILE_GLSL *glsl_header)
-{
-    struct gl_context local_ctx;
-    struct gl_context *ctx = &local_ctx;
-
-    _mesa_create_shader_compiler();
-    initialize_mesa_context_to_defaults(ctx);
-
-    struct gl_shader_program *shader_program = brw_new_shader_program(ctx, 0);
-    assert(shader_program != NULL);
-
-    shader_program->InfoLog = ralloc_strdup(shader_program, "");
-    shader_program->Shaders =
-    reralloc(shader_program, shader_program->Shaders,
-        struct gl_shader *, shader_program->NumShaders + 1);
-    assert(shader_program->Shaders != NULL);
-
-    struct gl_shader *shader = rzalloc(shader_program, struct gl_shader);
-
-    shader_program->Shaders[shader_program->NumShaders] = shader;
-    shader_program->NumShaders++;
-
-    shader->Source = glsl_header->pCode;
-
-    // We should parse the glsl text out of bil right now, but
-    // instead we are just plopping down our glsl
-    switch(glsl_header->stage) {
-    case XGL_SHADER_STAGE_VERTEX:
-        shader->Type = GL_VERTEX_SHADER;
-        break;
-    case XGL_SHADER_STAGE_FRAGMENT:
-        shader->Type = GL_FRAGMENT_SHADER;
-        break;
-    default:
-        assert(0);
-        break;
+        // We should parse the glsl text out of bil right now, but
+        // instead we are just plopping down our glsl
+        switch(executionModel) {
+        case glbil::ModelVertex:
+            shader->Type = GL_VERTEX_SHADER;
+            break;
+        case glbil::ModelFragment:
+            shader->Type = GL_FRAGMENT_SHADER;
+            break;
+        default:
+            assert(0);
+            break;
+        }
     }
 
     shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type);
diff --git a/icd/intel/compiler/shader/compiler_interface.h b/icd/intel/compiler/shader/compiler_interface.h
index 986daf9..4205d1c 100644
--- a/icd/intel/compiler/shader/compiler_interface.h
+++ b/icd/intel/compiler/shader/compiler_interface.h
@@ -40,11 +40,8 @@
 
 void initialize_mesa_context_to_defaults(struct gl_context *ctx);
 
-struct gl_shader_program *shader_create_program_glsl(struct intel_shader *sh,
-                                                     const XGL_INTEL_COMPILE_GLSL *glsl_header);
-
-struct gl_shader_program *shader_create_program_bil(struct intel_shader *sh,
-                                                    const struct icd_bil_header *bil,
+struct gl_shader_program *shader_create_program(struct intel_shader *sh,
+                                                    const void *code,
                                                     XGL_SIZE size);
 
 void shader_destroy_program(struct gl_shader_program *shader_program);
diff --git a/icd/intel/intel.h b/icd/intel/intel.h
index dd2b064..4515b91 100644
--- a/icd/intel/intel.h
+++ b/icd/intel/intel.h
@@ -37,7 +37,6 @@
 #include <xgl.h>
 #include <xglDbg.h>
 #include <xglWsiX11Ext.h>
-#include <xglIntelExt.h>
 
 #include "icd.h"
 #include "icd-bil.h"
diff --git a/icd/intel/obj.c b/icd/intel/obj.c
index 149553f..d5d3250 100644
--- a/icd/intel/obj.c
+++ b/icd/intel/obj.c
@@ -153,9 +153,7 @@
         assert(info.header->struct_type == XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO);
         break;
     case XGL_DBG_OBJECT_SHADER:
-        assert(info.header->struct_type == XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO ||
-               (dbg->dev->exts[INTEL_EXT_COMPILE_GLSL] &&
-                ((XGL_INTEL_STRUCTURE_TYPE)info.header->struct_type == XGL_INTEL_STRUCTURE_TYPE_SHADER_CREATE_INFO)));
+        assert(info.header->struct_type == XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO);
         shallow_copy = sizeof(XGL_SHADER_CREATE_INFO);
         break;
     default:
diff --git a/icd/intel/shader.c b/icd/intel/shader.c
index 9e4a312..0f94002 100644
--- a/icd/intel/shader.c
+++ b/icd/intel/shader.c
@@ -30,32 +30,7 @@
 #include "shader.h"
 #include "compiler/shader/compiler_interface.h"
 
-static XGL_RESULT shader_parse_glsl(struct intel_shader *sh,
-                                   const struct intel_gpu *gpu,
-                                   const XGL_INTEL_COMPILE_GLSL *glsl_header,
-                                   XGL_SIZE size)
-{
-    struct intel_ir *ir;
-
-    ir = icd_alloc(sizeof(*ir), 0, XGL_SYSTEM_ALLOC_INTERNAL_SHADER);
-    if (!ir)
-        return XGL_ERROR_OUT_OF_MEMORY;
-
-    ir->size = size;
-
-    // invoke our program creation as well
-    ir->shader_program = shader_create_program_glsl(sh, glsl_header);
-    if (!ir->shader_program)
-        return XGL_ERROR_BAD_SHADER_CODE;
-
-    // TODO: set necessary shader information. This should really
-    // happen as result of create_program call.
-    sh->ir = ir;
-
-    return XGL_SUCCESS;
-}
-
-static XGL_RESULT shader_parse_bil(struct intel_shader *sh,
+static XGL_RESULT shader_parse(struct intel_shader *sh,
                                    const struct intel_gpu *gpu,
                                    const struct icd_bil_header *bil,
                                    XGL_SIZE size)
@@ -69,7 +44,7 @@
     ir->size = size - sizeof(*bil);
 
     // invoke our program creation as well
-    ir->shader_program = shader_create_program_bil(sh, bil, size);
+    ir->shader_program = shader_create_program(sh, bil, size);
     if (!ir->shader_program)
         return XGL_ERROR_BAD_SHADER_CODE;
 
@@ -105,28 +80,19 @@
     if (!sh)
         return XGL_ERROR_OUT_OF_MEMORY;
 
-    if (dev->exts[INTEL_EXT_COMPILE_GLSL] &&
-        info->sType == (XGL_STRUCTURE_TYPE) XGL_INTEL_STRUCTURE_TYPE_SHADER_CREATE_INFO) {
-        // use GLSL compiler extension
-        ret = shader_parse_glsl(sh, dev->gpu, info->pCode, info->codeSize);
-        if (ret != XGL_SUCCESS) {
-            shader_destroy(&sh->obj);
-            return ret;
-        }
-    } else {
-        if (info->codeSize < sizeof(*bil))
-            return XGL_ERROR_INVALID_MEMORY_SIZE;
-        if (bil->magic != ICD_BIL_MAGIC)
-            return XGL_ERROR_BAD_SHADER_CODE;
+    if (info->codeSize < sizeof(*bil))
+        return XGL_ERROR_INVALID_MEMORY_SIZE;
+    if (bil->magic != ICD_BIL_MAGIC)
+        return XGL_ERROR_BAD_SHADER_CODE;
 
 
-        ret = shader_parse_bil(sh, dev->gpu, bil, info->codeSize);
-        if (ret != XGL_SUCCESS) {
-            shader_destroy(&sh->obj);
-            return ret;
-        }
+    ret = shader_parse(sh, dev->gpu, bil, info->codeSize);
+    if (ret != XGL_SUCCESS) {
+        shader_destroy(&sh->obj);
+        return ret;
     }
 
+
     sh->obj.destroy = shader_destroy;
 
     *sh_ret = sh;