HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, UINT flags, ID3DBlob **shader, ID3DBlob **error_messages) { HRESULT hr; TRACE("data %p, datasize %lu, filename %s, defines %p, include %p, sflags %#x,\n" "shader %p, error_messages %p\n", data, datasize, debugstr_a(filename), defines, include, flags, shader, error_messages); EnterCriticalSection(&wpp_mutex); /* TODO: flags */ if (flags) FIXME("flags %x\n", flags); if (shader) *shader = NULL; if (error_messages) *error_messages = NULL; hr = preprocess_shader(data, datasize, filename, defines, include, error_messages); if (SUCCEEDED(hr)) hr = assemble_shader(wpp_output, shader, error_messages); HeapFree(GetProcessHeap(), 0, wpp_output); LeaveCriticalSection(&wpp_mutex); return hr; }
static struct fd3_shader_stateobj * create_shader(struct pipe_context *pctx, const struct pipe_shader_state *cso, enum shader_t type) { struct fd3_shader_stateobj *so = CALLOC_STRUCT(fd3_shader_stateobj); int ret; if (!so) return NULL; so->type = type; if (fd_mesa_debug & FD_DBG_DISASM) { DBG("dump tgsi: type=%d", so->type); tgsi_dump(cso->tokens, 0); } if (type == SHADER_FRAGMENT) { /* we seem to get wrong colors (maybe swap/endianess or hw issue?) * with full precision color reg. And blob driver only seems to * use half precision register for color output (that I can find * so far), even with highp precision. So for force half precision * for frag shader: */ so->half_precision = true; } ret = fd3_compile_shader(so, cso->tokens); if (ret) { debug_error("compile failed!"); goto fail; } assemble_shader(pctx, so); if (!so->bo) { debug_error("assemble failed!"); goto fail; } if (type == SHADER_VERTEX) fixup_vp_regfootprint(so); if (fd_mesa_debug & FD_DBG_DISASM) { DBG("disassemble: type=%d", so->type); disasm_a3xx(fd_bo_map(so->bo), so->info.sizedwords, 0, so->type); } return so; fail: delete_shader(so); return NULL; }
int _tmain(int argc, _TCHAR* argv[]) { int i; if (argc == 1) return assemble_stdin(); for (i = 1; i < argc; i++) assemble_shader(argv[i]); return 0; }
/* once the compiler is good enough, we should construct TGSI in the * core freedreno driver, and then let the a2xx/a3xx parts compile * the internal shaders from TGSI the same as regular shaders. This * would be the first step towards handling most of clear (and the * gmem<->mem blits) from the core via normal state changes and shader * state objects. * * (Well, there would still be some special bits, because there are * some registers that don't get set for normal draw, but this should * be relatively small and could be handled via callbacks from core * into a2xx/a3xx..) */ static struct fd3_shader_stateobj * create_internal_shader(struct pipe_context *pctx, enum shader_t type, struct ir3_shader *ir) { struct fd3_shader_stateobj *so = CALLOC_STRUCT(fd3_shader_stateobj); if (!so) { ir3_shader_destroy(ir); return NULL; } so->type = type; so->ir = ir; assemble_shader(pctx, so); assert(so->bo); return so; }