intel: complete plumbing to add GLSL compile extension
diff --git a/icd/intel/shader.c b/icd/intel/shader.c
index 012410b..c9e8faa 100644
--- a/icd/intel/shader.c
+++ b/icd/intel/shader.c
@@ -30,6 +30,44 @@
#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;
+
+ // invoke our program creation as well
+ ir->shader_program = shader_create_program(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;
+ switch (glsl_header->stage) {
+ case XGL_SHADER_STAGE_VERTEX:
+ sh->uses |= INTEL_SHADER_USE_VID;
+ sh->in_count = 1;
+ sh->out_count = 2;
+ sh->urb_grf_start = 1;
+ break;
+ case XGL_SHADER_STAGE_FRAGMENT:
+ sh->out_count = 1;
+ sh->surface_count = 1;
+ sh->urb_grf_start = 2;
+ break;
+ default:
+ break;
+ }
+
+ return XGL_SUCCESS;
+}
+
static XGL_RESULT shader_parse_bil(struct intel_shader *sh,
const struct intel_gpu *gpu,
const struct icd_bil_header *bil,
@@ -49,20 +87,7 @@
return XGL_ERROR_OUT_OF_MEMORY;
}
- memcpy(ir->kernel, bil + 1, ir->size);
-
- //
- // TEMPORARY CODE TO INVOKE COMPILER
- //
-
- // invoke our program creation as well
- ir->shader_program = shader_create_program(sh, bil);
- if (!ir->shader_program)
- return XGL_ERROR_BAD_SHADER_CODE;
-
- //
- // END TEMPORARY CODE
- //
+ // TODO: Translate BIL header to internal-IR
sh->ir = ir;
switch (bil->gen_magic) {
@@ -110,8 +135,11 @@
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;