Commit 061bcfe61877c8e2e592479fdd0f60920ad7b9ac

  • avatar
  • Chia-I Wu <olvaffe @gm…l.com>
  • Wed Oct 21 11:04:34 CEST 2009
EGLKMSSurface: Handle buffer swapping correctly.

setCrtc should be called before swapping, and the back buffer should be
moved to CPU domain for libagl.
  
6565 static uint32_t hook_swapBuffers(NativeWindowType window);
6666
6767 int setCrtc();
68 int setCPUDomain();
6869 uint32_t swapBuffers();
6970
7071 status_t addFb(int fd);
  
179179 return ret;
180180}
181181
182int EGLKMSSurface::setCPUDomain()
183{
184 struct drm_i915_gem_set_domain set_domain;
185 int ret;
186
187 memset(&set_domain, 0, sizeof(set_domain));
188 set_domain.handle = mFb[1 - mIndex].handle;
189 set_domain.read_domains = I915_GEM_DOMAIN_CPU;
190 set_domain.write_domain = I915_GEM_DOMAIN_CPU;
191
192 ret = ioctl(egl_native_window_t::fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
193 if (ret)
194 LOGE("failed to set back buffer to CPU domain");
195 return ret;
196}
197
182198uint32_t EGLKMSSurface::swapBuffers()
183199{
184200 int ret;
204204 setCrtc();
205205#else
206206 // do the actual flip
207 setCrtc();
207208 mIndex = 1 - mIndex;
209
208210 egl_native_window_t::oem[0] = mFb[1 - mIndex].name;
209211#if AGL_SUPPORT
210212 egl_native_window_t::offset =
211213 intptr_t(mFb[1 - mIndex].base) - egl_native_window_t::base;
214 setCPUDomain();
212215#endif
213
214 setCrtc();
215216#endif /* SINGLE_BUFFER_HACK */
216217
217218 mPageFlipCount++;