} shader_time;
struct intel_screen *intelScreen;
+
+ // LunarG : ADD
+ // Give us a place to store our compile results
+ struct gl_shader_program *shader_prog;
};
return false;
}
- if (brw->ctx.Const.DeferLinkProgram) {
- brw_shader_program_save_wm_compile(prog, c);
- }
- else {
- uint32_t old_prog_offset = brw->wm.base.prog_offset;
- struct brw_wm_prog_data *old_prog_data = brw->wm.prog_data;
-
-// brw_wm_upload_compile(brw, c);
-
- brw->wm.base.prog_offset = old_prog_offset;
- brw->wm.prog_data = old_prog_data;
- }
+ // Rather than defer or upload to cache, hand off
+ // the compile results back to the brw_context
+ brw_shader_program_save_wm_compile(brw->shader_prog, c);
brw_wm_clear_compile(brw, c);
return (struct brw_shader_program *) prog;
}
+struct brw_wm_prog_data *get_wm_prog_data(struct gl_shader_program *prog)
+{
+ struct brw_shader_program *brw_prog = (struct brw_shader_program *) prog;
+ return &brw_prog->wm.data;
+}
+
+const unsigned *get_wm_program(struct gl_shader_program *prog)
+{
+ struct brw_shader_program *brw_prog = (struct brw_shader_program *) prog;
+ return brw_prog->wm.program;
+}
+
+unsigned get_wm_program_size(struct gl_shader_program *prog)
+{
+ struct brw_shader_program *brw_prog = (struct brw_shader_program *) prog;
+ return brw_prog->wm.program_size;
+}
+
struct gl_shader *
brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type)
{
shader->base.Type = type;
shader->base.Stage = _mesa_shader_enum_to_shader_stage(type);
shader->base.Name = name;
-// _mesa_init_shader(ctx, &shader->base);
+ // LunarG: Removed
+ //_mesa_init_shader(ctx, &shader->base);
}
return &shader->base;
struct brw_gs_compile;
struct brw_wm_compile;
-GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
-
const struct brw_shader_program_precompile_key *
brw_shader_program_get_precompile_key(struct gl_shader_program *shader_prog);
brw_shader_program_restore_wm_compile(struct gl_shader_program *shader_prog,
struct brw_wm_compile *c);
+// LunarG : ADD
+// Exposing some functions that were abstracted away, would be good to put them back
+struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name);
+struct brw_shader_program *get_brw_shader_program(struct gl_shader_program *prog);
+GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
+struct brw_wm_prog_data *get_wm_prog_data(struct gl_shader_program *prog);
+const unsigned *get_wm_program(struct gl_shader_program *prog);
+unsigned get_wm_program_size(struct gl_shader_program *prog);
+
#ifdef __cplusplus
}
#endif
unsigned *final_assembly_size);
void brw_notify_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
+// LunarG : TODO - find a way to call these as they were
//GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
struct gl_shader *brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type);
-struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name);
+// LunarG : TODO - find a way to call these as they were
+//struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name);
bool brw_color_buffer_write_enabled(struct brw_context *brw);
void brw_wm_debug_recompile(struct brw_context *brw,
#include "xgl.h" // for XGL_RESULT
#include "shader.h"
+#include "pipeline.h"
#include "compiler/shader/compiler_interface.h"
#include "compiler/pipeline/pipeline_compiler_interface.h"
#include "compiler/pipeline/brw_context.h"
#include "compiler/pipeline/brw_shader.h"
#include "compiler/mesa-utils/src/mesa/main/context.h"
+#include "compiler/mesa-utils/src/glsl/ralloc.h"
#include "compiler/pipeline/brw_device_info.h"
+#include "compiler/pipeline/brw_wm.h"
void initialize_brw_context(struct brw_context *brw)
//brw->intelScreen->vec4_reg_set
//brw->intelScreen->wm_reg_sets
+
+ brw->shader_prog = brw_new_shader_program(&brw->ctx, 0);
+}
+
+static inline void pipeline_destroy_compile(struct brw_context *brw) {
+ delete brw->intelScreen->devinfo;
+ delete brw->intelScreen;
+ ralloc_free(brw->shader_prog);
}
extern "C" {
XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *pipe_shader,
const struct intel_shader *shader)
{
- // first take at standalone backend compile
- switch(shader->ir->shader_program->Shaders[0]->Type) {
- case GL_FRAGMENT_SHADER:
- {
+ XGL_RESULT status = XGL_SUCCESS;
- // create a brw_context
- struct brw_context local_brw;
- struct brw_context *brw = &local_brw;
+ // create a brw_context
+ struct brw_context local_brw;
+ struct brw_context *brw = &local_brw;
- initialize_brw_context(brw);
+ // allocate sub structures on the stack
+ initialize_brw_context(brw);
- // LunarG : TODO - should this have been set for us somewhere?
- shader->ir->shader_program->Type =
- shader->ir->shader_program->Shaders[0]->Stage;
+ // LunarG : TODO - should this have been set for us somewhere?
+ shader->ir->shader_program->Type =
+ shader->ir->shader_program->Shaders[0]->Stage;
- brw_link_shader(&brw->ctx, shader->ir->shader_program);
- //brw_fs_precompile(ctx, shader->ir->shader_program);
+ if (brw_link_shader(&brw->ctx, shader->ir->shader_program)) {
+
+ // first take at standalone backend compile
+ switch(shader->ir->shader_program->Shaders[0]->Type) {
+ case GL_FRAGMENT_SHADER:
+ {
+ // Start pulling bits out of our compile result.
+ // see upload_ps_state() for references about what I believe each of these values are
+ // Note that they will currently be overwritten by pipeline_shader_copy_ir
+ // to allow the triangle to continue rendering
+ // I would prefer to find a way to pull this data out without exposing
+ // the internals of the compiler, but it hasn't presented itself yet
+ struct brw_wm_prog_data *data = get_wm_prog_data(brw->shader_prog);
+ pipe_shader->pCode = (void*)get_wm_program(brw->shader_prog);
+ pipe_shader->codeSize = get_wm_program_size(brw->shader_prog);
+ pipe_shader->out_count; // this appears to not be hooked up for FS
+ pipe_shader->surface_count = data->base.binding_table.size_bytes / 4;
+ pipe_shader->urb_grf_start = data->first_curbe_grf;
}
- break;
+ break;
- case GL_VERTEX_SHADER:
- case GL_GEOMETRY_SHADER:
- case GL_COMPUTE_SHADER:
- default:
+ case GL_VERTEX_SHADER:
+ case GL_GEOMETRY_SHADER:
+ case GL_COMPUTE_SHADER:
+ default:
+ assert(0);
+ status = XGL_ERROR_BAD_PIPELINE_DATA;
+ }
+ } else {
assert(0);
- return XGL_ERROR_BAD_PIPELINE_DATA;
+ status = XGL_ERROR_BAD_PIPELINE_DATA;
}
- return XGL_SUCCESS;
+ pipeline_destroy_compile(brw);
+
+ return status;
}
-// note - free ctx, brw_context, devinfo, and screen
} // extern "C"
#include "compiler/shader/program.h"
#include "compiler/mesa-utils/src/mesa/main/context.h"
#include "compiler/shader/standalone_scaffolding.h"
+#include "compiler/pipeline/brw_wm.h"
+#include "compiler/pipeline/brw_shader.h"
void initialize_mesa_context_to_defaults(struct gl_context *ctx)
{
_mesa_create_shader_compiler();
initialize_mesa_context_to_defaults(ctx);
- struct gl_shader_program *shader_program;
-
- shader_program = rzalloc (NULL, struct gl_shader_program);
+ 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->InfoLog = ralloc_strdup(shader_program, "");
shader_program->Shaders =
reralloc(shader_program, shader_program->Shaders,
struct gl_shader *, shader_program->NumShaders + 1);