Bonjour à tous,

J'ai extrait ce petit programme à partir d'un plus gros projet de GPGPU qui marchait très bien sur le forceware 163.71 ainsi que sur les versions précédentes.

Mais sur le 169.21 whql ainsi que sur les version beta 169.28 et 171.16 il crashe méchament avec la call stack suivante (dans visual c++ 2005):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
nvoglnt.dll!6959b54a() 	
cgGL.dll!00338651() 	
cgGL.dll!0033a336() 	
cgGL.dll!00332a80() 	
reconstInd.exe!applyShader()  Ligne 146 + 0xe octets	C++
reconstInd.exe!main(int argc=1, char * * argv=0x00bf66f8)  Ligne 225	C++
reconstInd.exe!__tmainCRTStartup()  Ligne 586 + 0x19 octets	C
reconstInd.exe!mainCRTStartup()  Ligne 403	C
kernel32.dll!7c816fd7()
autrement dit à la ligne :
cgGLEnableTextureParameter(mParamTex[0]);

Le test à été fait sur une geforce 7950GX2 et sur 8800 GTS 512 et sur une 6800 ultra.

7950GX2 avec forceware 163.71 et inférieur -> ok
7950GX2 avec forceware 169.21 -> crash

8800 GTS -> crash et on peut pas mettre des drivers de version inférieurs donc c'est la le gros problème.

6800 avec 93.71 -> ok

Donc tout semble indiquer que le crash est causer par les drivers.

Aussi je demande vos avis éclairé pour savoir, si je n'aurais pas commis une erreur quelque part, que les anciens drivers laissait passer ou s'il n'y a pas moyen de contourner le problème.

Le programme suivant fait la multiplication de 3 textures et place le résultat dans la quatrième, jusque là ça va. Mais dans mon projet j'ai besoin de repeter l'opération de très nombreuses fois (c'est en fait plusieurs coupes d'un volumes qu'il faut traiter une par une mais la j'ai modifier le programme et j'ai enlever plein de truc pour me concentrer sur le plantage et pouvoir vous le poster ici).
Et au bout d'un moment lorsque la boucle for(int iter=0;iter<200;iter++) arrive a 32 itérations il y a plantage. Si je mets que deux textures dans le shader le crash intervient plus tard, si j'en met qu'une, encore plus tard, on dirait qu'il y a un débordement d'un pile.

le fichier cpp :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#include <fstream> 
#include <sstream> 
#include <iostream> 
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits>
#include <string>
#include <vector>
 
#include <gl/glew.h>
#include <cg/cg.h>
#include <cg/cgGL.h>
#include <gl/glut.h>
 
using namespace std;
 
#define IMAGE_SIZE 128
#define NB_TEXT 4
 
 
CGprogram mProgram;
CGparameter mParamTex[3];
CGcontext mContextCG;
CGprofile mProfileCG;
 
 
GLuint mTexCoefId;
GLuint mTexTemp[NB_TEXT];
 
GLuint mFrameBufferID;
 
// check FBO errors
std::string checkFBO()
{
	string result;
	GLenum status;
    status = (GLenum) glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    switch(status) {
        case GL_FRAMEBUFFER_COMPLETE_EXT:
			result="";
            break;
        case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
            result="Unsupported framebuffer format\n";
            break;
        case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
            result="Framebuffer incomplete, missing attachment\n";
            break;
        //case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT:
        //    result="Framebuffer incomplete, duplicate attachment\n";
        //    break;
        case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
            result="Framebuffer incomplete, attached images must have same dimensions\n";
            break;
        case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
            result="Framebuffer incomplete, attached images must have same format\n";
            break;
        case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
            result="Framebuffer incomplete, missing draw buffer\n";
            break;
        case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
            result="Framebuffer incomplete, missing read buffer\n";
            break;
        default:
			result="Unknown Error\n";
            break;
    }
 
	return result;
}
 
 
void drawQuad()
{
	glBegin(GL_QUADS);
	glTexCoord2f(0,0);
	glVertex3f(0,0,0);				
 
	glTexCoord2f(0,1); 
	glVertex3f(0,1,0);				
 
	glTexCoord2f(1,1);				
	glVertex3f(1,1,0);
 
	glTexCoord2f(1,0);
	glVertex3f(1,0,0);
	glEnd();
}
 
void initProjMatrix()
{
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0,1,0,1,-1,1);
	glMatrixMode(GL_MODELVIEW);
 
}
 
void initTex()
{
	glGenTextures(NB_TEXT,mTexTemp);
	for(int i=0;i<NB_TEXT;i++)
	{
		float *data=new float[IMAGE_SIZE*IMAGE_SIZE];
		for(int j=0;j<IMAGE_SIZE*IMAGE_SIZE;j++)
		{
			data[j]=i+1+(j%2);
		}
 
 
		glBindTexture(GL_TEXTURE_2D, mTexTemp[i]);
		glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB,IMAGE_SIZE,IMAGE_SIZE,0,GL_RED,GL_FLOAT,data);
 
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,	GL_NEAREST);  
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,	GL_NEAREST);
 
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,		GL_CLAMP_TO_EDGE);	
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,		GL_CLAMP_TO_EDGE);
 
		ostringstream filename;
		filename << "tex" << i << ".raw";
		ofstream fout(filename.str().c_str());
		fout.write((char*)data,IMAGE_SIZE*IMAGE_SIZE*sizeof(float));
		fout.close();
 
		delete data;
 
	}
}
 
 
void applyShader()
{
	initProjMatrix();
 
	glViewport(0,0,IMAGE_SIZE,IMAGE_SIZE);
	glColor4f(1.,1.,1.,1.);
 
 
	cgGLSetTextureParameter(mParamTex[0],mTexTemp[0]);
	cgGLSetTextureParameter(mParamTex[1],mTexTemp[1]);
	cgGLSetTextureParameter(mParamTex[2],mTexTemp[2]);
 
	cgGLEnableProfile(mProfileCG);
	cgGLEnableTextureParameter(mParamTex[0]);
	cgGLEnableTextureParameter(mParamTex[1]);
	cgGLEnableTextureParameter(mParamTex[2]);
 
	drawQuad();
 
	cgGLDisableTextureParameter(mParamTex[0]);
	cgGLDisableTextureParameter(mParamTex[1]);
	cgGLDisableTextureParameter(mParamTex[2]);
	cgGLDisableProfile(mProfileCG);
 
}
 
 
int main(int argc,char **argv)
{
 
	glutInit(&argc,argv);
	glutInitWindowPosition(0,0); 
	glutInitWindowSize(512,256); 
	glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
	glutCreateWindow("gni");
	//glutHideWindow();
 
 
	GLenum err = glewInit();
 
 
	initTex();
 
	glGenFramebuffersEXT(1,&mFrameBufferID);
 
	mContextCG = cgCreateContext();
	mProfileCG = cgGLGetLatestProfile(CG_GL_FRAGMENT);
	cgGLSetOptimalOptions(mProfileCG);
 
	mProgram=cgCreateProgramFromFile(mContextCG,CG_SOURCE,"shaders/text.cg",mProfileCG,NULL,NULL);
 
	if(mProgram==0)
	{
		cout << "error loading shader" << endl;
		getchar();
		return 1;
	};
 
	mParamTex[0]=cgGetNamedParameter(mProgram, "Texture0");
	mParamTex[1]=cgGetNamedParameter(mProgram, "Texture1");
	mParamTex[2]=cgGetNamedParameter(mProgram, "Texture2");
 
	cgGLLoadProgram(mProgram);
 
 
	float *data=new float[IMAGE_SIZE*IMAGE_SIZE];
 
 
	for(int iter=0;iter<200;iter++)
	{
		int subsetSize=60;
 
		initProjMatrix();
		glViewport(0,0,IMAGE_SIZE,IMAGE_SIZE);
 
		for(int i=0;i<subsetSize*IMAGE_SIZE;i++)
		{
			// framebuffer mTexTemp[3]
			glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFrameBufferID);
			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexTemp[3], 0);
 
			string errorFBO=checkFBO();
			if(errorFBO!="")
			{
				cout << errorFBO << endl;
				return 1;
			}
 
			// draw the quad with shader in FBO
			// mTexTemp[3]=mTexTemp[0]*mTexTemp[1]*mTexTemp[2]
			applyShader();
 
 
		}
 
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFrameBufferID);
 
		// write result in file out.raw
		glBindTexture(GL_TEXTURE_2D,mTexTemp[3]);
		glGetTexImage(GL_TEXTURE_2D,0,GL_RED,GL_FLOAT,data);
		ofstream fout("out.raw");
		//cout << data[10] << " " << data[11] << endl;
		fout.write((char*)data,IMAGE_SIZE*IMAGE_SIZE*sizeof(float));
 
		cout << "iter" << iter << endl;
 
 
	}
 
	cout << "end" << endl;
	getchar();
 
	glDeleteFramebuffersEXT(1,&mFrameBufferID);
	delete data;
	cgDestroyProgram(mProgram);
 
	return 0;
}
le shader cg :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
struct fragment{
	float4 position  : POSITION;
	float4 color0    : COLOR0;
	float4 texcoord0 : TEXCOORD0;
};
 
struct pixel{	
	float4 color : COLOR;
};
 
 
pixel main(fragment IN,uniform sampler2D Texture0,uniform sampler2D Texture1,uniform sampler2D Texture2)
{
	pixel OUT;
 
	float4  texelColor0 = tex2D( Texture0, IN.texcoord0.xy );
	float4  texelColor1 = tex2D( Texture1, IN.texcoord0.xy );
	float4  texelColor2 = tex2D( Texture2, IN.texcoord0.xy );
 
	OUT.color=texelColor0*texelColor1*texelColor2;	
	return OUT; 
}