8
8
% 24-Jan-2005 -- created; adapted from code in autocode.m (RFM)
9
9
% 06-Feb-2007 -- Modified; can now handle OpenAL as well. (MK)
10
10
% 24-Mar-2011 -- Modified; Perform 64-bit safe wrapping of encoded memory pointers. (MK)
11
% 28-Aug-2012 -- Modified; Handle datatypes GLint64, GLuint64 and GLsync. (MK)
12
13
% make lowercase function name, e.g., glVertex3dv --> gl_vertex3dv
13
14
k=min(find(funcp.fname~=lower(funcp.fname))); %#ok<MXFND>
34
35
% arguments to C function and M-file
35
36
if strcmp(funcp.argouttype.basetype,'void')==0,
36
37
% scalar return argument
37
if isempty(funcp.argouttype.stars),
38
if isempty(funcp.argouttype.stars) && strcmp(funcp.argouttype.basetype,'GLsync')==0,
38
39
C.arg_out{1}=sprintf('plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);\n\t*mxGetPr(plhs[0])=(double)');
69
70
funcp.argin.args(j).argname=sprintf('arg%d',j);
72
% scalar input argument?
73
if isempty(funcp.argin.args(j).type.stars),
73
% 64-Bit (unsigned) integer scalar input argument?
74
if isempty(funcp.argin.args(j).type.stars) && (strcmp(funcp.argin.args(j).type.basetype,'GLint64') || strcmp(funcp.argin.args(j).type.basetype,'GLuint64')),
75
% These need special treatment, as a double scalar can't fully
76
% represent a 64-Bit integer without loss of precision:
77
C.arg_in{end+1}=sprintf('(%s) *((%s*) mxGetData(prhs[%d]))',funcp.argin.args(j).type.full,funcp.argin.args(j).type.basetype,j-1);
78
M.arg_in{end+1}=funcp.argin.args(j).argname;
79
if strcmp(funcp.argin.args(j).type.basetype,'GLint64')
80
% Wrapper needs to cast to int64()
81
M.mogl_in{end+1} = sprintf('int64(%s)', funcp.argin.args(j).argname);
83
% Wrapper needs to cast to uint64()
84
M.mogl_in{end+1} = sprintf('uint64(%s)', funcp.argin.args(j).argname);
87
% GLsync handle scalar input argument?
88
elseif isempty(funcp.argin.args(j).type.stars) && strcmp(funcp.argin.args(j).type.basetype,'GLsync'),
89
% New style: Memory pointers are encoded opaque inside double
90
% scalar values. This is 64-bit safe.
91
% TODO: We could also use a mxUINT64_CLASS type aka uint64(), which
92
% would be nicer, but only after we decide to completely drop
93
% support for Matlab versions < R2007a.
94
C.arg_in{end+1}=sprintf('(%s) PsychDoubleToPtr(mxGetScalar(prhs[%d]))',funcp.argin.args(j).type.full,j-1);
95
M.arg_in{end+1}=funcp.argin.args(j).argname;
96
M.arg_in_check{end+1}=sprintf('if ~strcmp(class(%s),''double''),\n\terror([ ''argument ''''%s'''' must be a pointer coded as type double '' ]);\nend\n',funcp.argin.args(j).argname,funcp.argin.args(j).argname);
97
M.mogl_in{end+1}=funcp.argin.args(j).argname;
99
% other scalar input argument?
100
elseif isempty(funcp.argin.args(j).type.stars),
74
101
C.arg_in{end+1}=sprintf('(%s)mxGetScalar(prhs[%d])',funcp.argin.args(j).type.full,j-1);
75
102
M.arg_in{end+1}=funcp.argin.args(j).argname;
76
103
M.mogl_in{end+1}=funcp.argin.args(j).argname;
112
143
case { 'GLvoid' 'void' 'ALvoid' }
114
case { 'GLhandleARB' 'GLhandle' 'ALhandleARB' 'ALhandle' }
145
case { 'GLhandleARB' 'GLhandle' 'ALhandleARB' 'ALhandle' 'GLsync'}
115
146
% We use a double as an opaque data type for these, as they
116
147
% can be pointers or integers of 32-bit or 64-bit size.
117
148
% Safe approach is to use double, as it can contain 64-bits
142
173
% if pointer is not void, and is const, then typecast argument
143
if ~isempty(mcast) & ~thisallocate, %#ok<AND2>
174
if ~isempty(mcast) && ~thisallocate,
144
175
M.mogl_in{end+1}=sprintf('%s(%s)',mcast,funcp.argin.args(j).argname);
146
177
M.mogl_in{end+1}=sprintf('%s',funcp.argin.args(j).argname);