@ -134,6 +134,7 @@ struct dump_ctx {
int size ;
int size ;
struct vrend_strbuf glsl_main ;
struct vrend_strbuf glsl_main ;
struct vrend_strbuf glsl_hdr ;
struct vrend_strbuf glsl_hdr ;
struct vrend_strbuf glsl_ver_ext ;
uint instno ;
uint instno ;
uint32_t num_interps ;
uint32_t num_interps ;
@ -539,6 +540,25 @@ static void emit_hdrf(struct dump_ctx *ctx, const char *fmt, ...)
va_end ( va ) ;
va_end ( va ) ;
}
}
static void emit_ver_ext ( struct dump_ctx * ctx , const char * buf )
{
strbuf_append ( & ctx - > glsl_ver_ext , buf ) ;
}
static void set_ver_ext_error ( struct dump_ctx * ctx )
{
strbuf_set_error ( & ctx - > glsl_ver_ext ) ;
}
__attribute__ ( ( format ( printf , 2 , 3 ) ) )
static void emit_ver_extf ( struct dump_ctx * ctx , const char * fmt , . . . )
{
va_list va ;
va_start ( va , fmt ) ;
strbuf_vappendf ( & ctx - > glsl_ver_ext , fmt , va ) ;
va_end ( va ) ;
}
static bool allocate_temp_range ( struct dump_ctx * ctx , int first , int last ,
static bool allocate_temp_range ( struct dump_ctx * ctx , int first , int last ,
int array_id )
int array_id )
{
{
@ -3839,30 +3859,16 @@ prolog(struct tgsi_iterate_context *iter)
return true ;
return true ;
}
}
/* reserve space for: "#extension GL_ARB_gpu_shader5 : require\n" */
# define PAD_GPU_SHADER5(ctx) \
emit_hdr ( ctx , " \n " )
# define PAD_GPU_MSINTERPOL(ctx) \
emit_hdr ( ctx , " \n " )
static void emit_ext ( struct dump_ctx * ctx , const char * name ,
static void emit_ext ( struct dump_ctx * ctx , const char * name ,
const char * verb )
const char * verb )
{
{
emit_hdr f ( ctx , " #extension GL_%s : %s \n " , name , verb ) ;
emit_ver_extf ( ctx , " #extension GL_%s : %s \n " , name , verb ) ;
}
}
static void emit_header ( struct dump_ctx * ctx )
static void emit_header ( struct dump_ctx * ctx )
{
{
if ( ctx - > cfg - > use_gles ) {
if ( ctx - > cfg - > use_gles ) {
emit_hdrf ( ctx , " #version %d es \n " , ctx - > cfg - > glsl_version ) ;
emit_ver_extf ( ctx , " #version %d es \n " , ctx - > cfg - > glsl_version ) ;
if ( ctx - > cfg - > glsl_version < 320 & &
( ctx - > prog_type = = TGSI_PROCESSOR_VERTEX | |
ctx - > prog_type = = TGSI_PROCESSOR_GEOMETRY | |
ctx - > prog_type = = TGSI_PROCESSOR_TESS_EVAL ) ) {
PAD_GPU_SHADER5 ( ctx ) ;
PAD_GPU_MSINTERPOL ( ctx ) ;
}
if ( ( ctx - > shader_req_bits & SHADER_REQ_CLIP_DISTANCE ) | |
if ( ( ctx - > shader_req_bits & SHADER_REQ_CLIP_DISTANCE ) | |
( ctx - > num_clip_dist = = 0 & & ctx - > key - > clip_plane_enable ) ) {
( ctx - > num_clip_dist = = 0 & & ctx - > key - > clip_plane_enable ) ) {
@ -3906,28 +3912,22 @@ static void emit_header(struct dump_ctx *ctx)
emit_ext ( ctx , " OES_shader_image_atomic " , " require " ) ;
emit_ext ( ctx , " OES_shader_image_atomic " , " require " ) ;
}
}
PAD_GPU_SHADER5 ( ctx ) ;
emit_hdr ( ctx , " precision highp float; \n " ) ;
emit_hdr ( ctx , " precision highp float; \n " ) ;
emit_hdr ( ctx , " precision highp int; \n " ) ;
emit_hdr ( ctx , " precision highp int; \n " ) ;
} else {
} else {
if ( ctx - > prog_type = = TGSI_PROCESSOR_COMPUTE ) {
if ( ctx - > prog_type = = TGSI_PROCESSOR_COMPUTE ) {
emit_hdr ( ctx , " #version 330 \n " ) ;
emit_ver_ext ( ctx , " #version 330 \n " ) ;
emit_ext ( ctx , " ARB_compute_shader " , " require " ) ;
emit_ext ( ctx , " ARB_compute_shader " , " require " ) ;
} else {
} else {
if ( ctx - > prog_type = = TGSI_PROCESSOR_GEOMETRY | |
if ( ctx - > prog_type = = TGSI_PROCESSOR_GEOMETRY | |
ctx - > prog_type = = TGSI_PROCESSOR_TESS_EVAL | |
ctx - > prog_type = = TGSI_PROCESSOR_TESS_EVAL | |
ctx - > prog_type = = TGSI_PROCESSOR_TESS_CTRL | |
ctx - > prog_type = = TGSI_PROCESSOR_TESS_CTRL | |
ctx - > glsl_ver_required = = 150 )
ctx - > glsl_ver_required = = 150 )
emit_hdr ( ctx , " #version 150 \n " ) ;
emit_ver_ext ( ctx , " #version 150 \n " ) ;
else if ( ctx - > glsl_ver_required = = 140 )
else if ( ctx - > glsl_ver_required = = 140 )
emit_hdr ( ctx , " #version 140 \n " ) ;
emit_ver_ext ( ctx , " #version 140 \n " ) ;
else
else
emit_hdr ( ctx , " #version 130 \n " ) ;
emit_ver_ext ( ctx , " #version 130 \n " ) ;
if ( ctx - > prog_type = = TGSI_PROCESSOR_VERTEX | |
ctx - > prog_type = = TGSI_PROCESSOR_GEOMETRY | |
ctx - > prog_type = = TGSI_PROCESSOR_TESS_EVAL )
PAD_GPU_SHADER5 ( ctx ) ;
}
}
if ( ctx - > prog_type = = TGSI_PROCESSOR_TESS_CTRL | |
if ( ctx - > prog_type = = TGSI_PROCESSOR_TESS_CTRL | |
@ -5029,6 +5029,9 @@ bool vrend_convert_shader(struct vrend_context *rctx,
if ( ! strbuf_alloc ( & ctx . glsl_hdr , 1024 ) )
if ( ! strbuf_alloc ( & ctx . glsl_hdr , 1024 ) )
goto fail ;
goto fail ;
if ( ! strbuf_alloc ( & ctx . glsl_ver_ext , 1024 ) )
goto fail ;
emit_header ( & ctx ) ;
emit_header ( & ctx ) ;
emit_ios ( & ctx ) ;
emit_ios ( & ctx ) ;
@ -5095,6 +5098,7 @@ bool vrend_convert_shader(struct vrend_context *rctx,
sinfo - > image_arrays = ctx . image_arrays ;
sinfo - > image_arrays = ctx . image_arrays ;
sinfo - > num_image_arrays = ctx . num_image_arrays ;
sinfo - > num_image_arrays = ctx . num_image_arrays ;
strarray_addstrbuf ( shader , & ctx . glsl_ver_ext ) ;
strarray_addstrbuf ( shader , & ctx . glsl_hdr ) ;
strarray_addstrbuf ( shader , & ctx . glsl_hdr ) ;
strarray_addstrbuf ( shader , & ctx . glsl_main ) ;
strarray_addstrbuf ( shader , & ctx . glsl_main ) ;
VREND_DEBUG ( dbg_shader_glsl , rctx , " GLSL: " ) ;
VREND_DEBUG ( dbg_shader_glsl , rctx , " GLSL: " ) ;
@ -5104,6 +5108,7 @@ bool vrend_convert_shader(struct vrend_context *rctx,
fail :
fail :
strbuf_free ( & ctx . glsl_main ) ;
strbuf_free ( & ctx . glsl_main ) ;
strbuf_free ( & ctx . glsl_hdr ) ;
strbuf_free ( & ctx . glsl_hdr ) ;
strbuf_free ( & ctx . glsl_ver_ext ) ;
free ( ctx . so_names ) ;
free ( ctx . so_names ) ;
free ( ctx . temp_ranges ) ;
free ( ctx . temp_ranges ) ;
return false ;
return false ;
@ -5116,7 +5121,7 @@ static void replace_interp(struct vrend_strarray *program,
char * ptr ;
char * ptr ;
int mylen = strlen ( INTERP_PREFIX ) + strlen ( " out vec4 " ) ;
int mylen = strlen ( INTERP_PREFIX ) + strlen ( " out vec4 " ) ;
ptr = strstr ( program - > strings [ 0 ] . buf , var_name ) ;
ptr = strstr ( program - > strings [ SHADER_STRING_HDR ] . buf , var_name ) ;
if ( ! ptr )
if ( ! ptr )
return ;
return ;
@ -5132,13 +5137,7 @@ static const char *gpu_shader5_string = "#extension GL_ARB_gpu_shader5 : require
static void require_gpu_shader5 ( struct vrend_strarray * program )
static void require_gpu_shader5 ( struct vrend_strarray * program )
{
{
/* the first line is the #version line */
strbuf_append ( & program - > strings [ SHADER_STRING_VER_EXT ] , gpu_shader5_string ) ;
char * ptr = strchr ( program - > strings [ 0 ] . buf , ' \n ' ) ;
if ( ! ptr )
return ;
ptr + + ;
memcpy ( ptr , gpu_shader5_string , strlen ( gpu_shader5_string ) ) ;
}
}
static const char * gpu_shader5_and_msinterp_string =
static const char * gpu_shader5_and_msinterp_string =
@ -5147,13 +5146,7 @@ static const char *gpu_shader5_and_msinterp_string =
static void require_gpu_shader5_and_msinterp ( struct vrend_strarray * program )
static void require_gpu_shader5_and_msinterp ( struct vrend_strarray * program )
{
{
/* the first line is the #version line */
strbuf_append ( & program - > strings [ SHADER_STRING_VER_EXT ] , gpu_shader5_and_msinterp_string ) ;
char * ptr = strchr ( program - > strings [ 0 ] . buf , ' \n ' ) ;
if ( ! ptr )
return ;
ptr + + ;
memcpy ( ptr , gpu_shader5_and_msinterp_string , strlen ( gpu_shader5_and_msinterp_string ) ) ;
}
}
bool vrend_patch_vertex_shader_interpolants ( struct vrend_context * rctx ,
bool vrend_patch_vertex_shader_interpolants ( struct vrend_context * rctx ,