Archive for the ‘未分类’ Category

Inside AMD 7900 ‘Leo’ demo: A bit more about their tile based forward lighting

2012年02月6日 Leave a comment

After some unzipping of their demo, and debugging with GPUPerfStudio, I found that my previous understanding of their method is quite close to the truth :). But their implementation, in terms of light culling, looks much more efficient (<0.1 ms in the demo). and here is the key difference. Note that the demo team did a lot of experimental branch code path, but many of them are not used at last. So I’m going to talk only about what is actually running in the final demo.

  • There are actually two Compute Shaders invoked across the frame. One for computing frustum for each tile, the other for culling. While in Intel’s demo they do Z reduction, frustum computing, and lighting in one shader.
  • Difference with thread dispatching:
    – 32 * 32 pixels for each tile, (vs 16 * 16);
    – 64 thread groups for each tile, (vs 16 * 16);
    – Dispatched groups is in 1D ( TileCount, 1, 1), (vs 2D ( TileCol, TileRow, 1 ))
  • They are using a 1D buffer for storing light indices.
  • They used two buffer for light properties, one for position and range, one for color. So there are less data to bind when doing culling pass.
  • They are not culling with Z-reduction. (There is actually a Z-pre pass ran for the demo, and they have a branch to do the Z reduction, but it is not used, at least for this release. Maybe they are going to provide some options to tweak it on off in the next releases.).

I tried with these hints in my test program and the result is obviously improved. I still kept depth reduction in the culling shader. Since now there are 64 threads for 32 * 32 pixels, I can calculate a minZ/maxZ for the 16 pixels within a thread, then do the interlocked min/max operation to write to group shared memory. I assume this is helpful for performance. The same could apply when writing light indices to group shared memory.

Here is a scene with 1024 big lights, and fairly depth complexity, run at around 200 fps, and light culling consumed 0.9ms according to GPUPerfStudio:

Thanks to the Rock model exported from UDK used in the test, copyright belongs to original author. And thanks to AMD’s demo team with this great implementation. As metioned in the last post, I believe the true power of this way is the  ability to use much more complicated shading models, and hope this could be “the way DX11’s meant to be played”…

Compile Error C3918 , for event in Cli/C++

2010年10月13日 Leave a comment

In C#, we can check if an event variable is null before firing the event. For example:

public class MyClass
  public event EventHandler MyEvent;
  public void FireEvent()
    // Check if there is any event handler registered.
    if (MyEvent != null) { MyEvent(this, new EventArgs()); }

But if we do the same thing in C++/CLI, we will get an compile error C3918.

ref class MyClass
  event EventHandler^ MyEvent;
  void FireEvent()
    if(MyEvent != nullptr) // C3918
      MyEvent(this, gcnew EventArgs());

Here is the solution:

public ref class MyClass
  EventHandler^ m_myEvent;
  event EventHandler^ MyEvent
    void add(EventHandler^ handler) { m_myEvent += handler; }
    void remove(EventHandler^ handler) { m_myEvent -= handler; }
    void raise(Object^ sender, EventArgs^ e)
      // Check if there is any event handler registered.
      if (m_myEvent != nullptr)
        m_myEvent->Invoke(sender, e);

Categories: 未分类

Let’s get rid of DirectInput

2010年04月22日 Leave a comment

"DirectInput is a set of API calls that abstracts input devices on the
system. Internally, DirectInput creates a second thread to read
WM_INPUT data, and using the DirectInput APIs will add more overhead
than simply reading WM_INPUT directly. DirectInput is only useful for
reading data from DirectInput joysticks; however, if you only need to
support the Xbox 360 controller for Windows, then use XInput
instead. Overall, using DirectInput offers no advantages when reading
data from mouse or keyboard devices, and the use of DirectInput in these
scenarios is discouraged."

I’m currently working on a wrapper class for keyboard and mouse inputs using this WM_INPUT and raw-input data. It will be here soon.

Categories: 未分类

Extensions to Luna to support userdata as return values from a lua-c call

2010年04月21日 Leave a comment
As a helper to Lua-C interops, Luna is pretty small and elegant without fucking usage of boost or python.
But there seems to be no support for userdata ( such as a C class pointer, witch will be used in lua ) as return values from a c function. So we made a bit extension.

With a public member function "push_userdata":

    static void push_userdata(lua_State *L, T* pT) {
        userdataType *ud =
            static_cast<userdataType*>(lua_newuserdata(L, sizeof(userdataType)));
        ud->pT = pT;
        luaL_getmetatable(L, T::className);
        lua_setmetatable(L, -2);

and a macro

#define PUSH_USERDATA(ClassName, LuaState, UserDataPtr) Luna<ClassName>::push_userdata(LuaState, UserDataPtr);
#define DECL_SCRIPT_METHOD(FunctionName) int FunctionName(lua_State* L)
#define IMPL_SCRIPT_METHOD(ClassName, FunctionName) int ClassName::FunctionName(lua_State* L)

So we can use that:

//in .h
class B;
class A {
    B* m_pB;
    B* GetB() { return m_pB; }


//in .cpp

    PUSH_USERDATA(A, L, this->GetB())
    return 1;

It seems working correctly. A new user data is created once the method is called from lua.
I’m doubtting if there are safety or efficiency problems with this implementation. Farther tests are taking on and hope your advise 🙂

Categories: 未分类


2010年03月10日 Leave a comment


一九八一年春天,我是北大本科生的时候,发表过一篇题为《未名湖,你听我说》的短文,写到了湖畔风光和刚刚过去的文革祸难,也写了自己得到某种选择的 自由时产生的惶惑、思考和自勉。这篇文章曾做成配乐朗诵在电台广播,也被选入现代散文选集。我曾收到不少读者来信。他们诚挚坦率的言辞给了我温暖的鼓励。
这次前辈校友邀请撰写未名湖,我担心会重复旧话而不能动笔,直到我写完了《六十三名受难者和北京大学文革》。多年以来,我访问了上千的文革经历者,也 收集当时的文字资料。在前年完成的五十万字的《文革受难者》一书中,所记六百五十九名受难者出自全国各地,按照姓名拼音次序排列,而这一篇集中于北大一个 学校。
一九六八年,俄语系讲师龚维泰被关在第一教室楼。他睡在地板上,看守他的人睡在床上。十一月七日,他在系中遭到“斗争”,除了“坐喷气式飞机”即弯腰 低头双臂被反拧在后形如飞机之外,拧他手臂的学生还用脚往下踹他的肩膀。那天夜间,龚维泰用刮脸刀割动脉自杀。第二天早上看守呵叱他为什么不起床,掀开被 子看到血流了一地。他的一个同事那天从门外经过,看到地面湿湿的,刚刚用拖把擦过,后来才知道用水擦去的是龚维泰的血。
进北大西门往北,在校园的西北角上有一个幽静的小湖。这小湖是北大湖群中的一个,却没有名字,似乎是真正的“未名”之湖。地处“海淀”(此“海”并非 今日所说的“大海”之海),北大校园有若干小湖,未名湖是其中大者。那小湖岸边有一棵大树,树上有一根横枝伸向湖面。经济系学生杨明爱被指控为“反动学 生”并停发生活费。一九六六年九月,当红卫兵们得到免费车票和食宿兴高采烈到全国各地“革命大串连”的时候,杨明爱在那根横枝上吊死了自己。那小湖、大树 以及那横枝至今依然还在,杨明爱的名字则没有人知道了。 
陈彦荣是中国科学院气体厂工人,三十七岁,家住北大旁边的蓝旗营一O九号。一九六六年八月二十七日傍晚,北京大学附属中学红卫兵抄了他的家,并把他和 妻子刘万才一起抓到北京大学附属中学校内。他们用铜头皮带、木棒和铁条毒打陈彦荣刘万才夫妇。下半夜一点,陈彦荣被打死,刘万才也被打得遍体鳞伤。和陈彦 荣一起被打死的,还有一名至今不知姓名的老年女人。文革后“平反”,标准做法是付给家人二百四十元。陈彦荣有六个未成年的孩子,因此北大给了他家二千五百 元。他的妻子拿到钱的时候说:“我一辈子从来没见过这么多钱呀。”然后她大哭说:“我要钱干什么?我要人呐。”
一九九八年为百年校庆编写了两卷本北大历史。我注意到,书中只印出了文革中被迫害致死的正教授的名字,连副教授都不记,更不要说年轻教员和普通职员、 炊事员了。(北京农业大学校史印出了包括助教学生在内的三十名文革受难者的名字。不过,清华大学篇幅更长的校史连正教授的名字都没有写。)我为此问起北大 出版社的编辑。编辑苦笑着说,就这样,还有人到办公室来纠缠,要把现有校史的文革部分删除。
一九九九年,一位同届北大同学告诉我,历史系俞伟超老师在大教室讲授“秦汉考古”,听课的学生很多,也都看到他缺失手指,听说是在文革中遭到“批斗” (需要一本文革“词典”来解释这种词语,不过本书读者多半还都知其意)后自杀未死留下的残疾。他那时任中国历史博物馆馆长,我立刻就往博物馆给他写了信, 希望了解他的文革遭遇。
北大历史系在文革中有五个人“自杀”身亡。我用了引号,因为不认为这是通常所说的“自杀”,而是被文革谋杀的。俞伟超老师在一九六六年文革开始的时候 两次自杀。第一次触高压电,双手食指被烧毁。第二次卧轨,火车头把他铲出了轨道。他活了下来,文革后成为中国历史的最高行政长官之一。我当然不会给他讲历 史写作重要性的大道理,也不会跟他说如果北大历史系的文革历史都不写出,遑论别处。他的失去的手指显然也每一天都提醒着他的文革经历。但是,连他也对文革 历史讳莫如深。这是因为什么?我确实很想向他询问,而不是自己来猜测。可是我一直没有能找到他的电话号码,也不可能再找到——他已经在去年离世。
一本世界历史书谈到亚洲文明古国时说,印度是一个宗教的国度,中国是一个历史的国度。这种说法大概过于简略。不过,中国古代文明确实留下了很多历史 书。实际上,在中国的传统中,除了记录发生过的事情,历史写作也承担了其他文明中可能并非由其承担的任务,其中最突出的一个方面是阐明道德原则和是非基 准。正因为此,历史写作也更加具有正面的建设性的意义。我以为文革历史的写作,对当代人尤其可能具有这方面的意义。这项工作是为了面对历史、记录真相,也 是为了社会的道德自救。
一九九O年代,在北大西门内,盖起了漂亮的赛克勒考古博物馆。我在那里看到远古时代的石器,在玻璃背后,在柔和的灯光下,熠熠生辉。可是我也知道,一 九六八年五月十六日,就在这块宅基地上,在互为直角的“民主楼”和“外文楼”对面,又加筑了两面围墙,围成了“监改大院”,关押了北大二百多名“牛鬼蛇 神”。因为被关者不被认为是人,这种校园监狱被俗称为“牛棚”,全国每个单位都建立了。这座大“牛棚”存在了十个月,里面有监规,还有各种刑罚。英语教授 徐锡良,是在美国出生长大的华侨,普通话说得不太流利,有一天没有能背诵出毛泽东语录,被罚跪的时候,头上还顶了一块板,板上放了一碗水,水翻出来就遭 打。西语系另一教授朱光潜有一天正在“劳改”,一个看守人员叫他过去,扔给他一条绳子,说:“老家伙你活得腻不腻?上吊吧。要不,用剪子刀子也行。”文革 中西语系也有五个人被迫害致死。
石器时代的文物当然应该珍藏,但是文革历史如“牛棚”也应该被记载,文革受难者的名单也应该被永久保存在博物馆里面让人看到。在这个科学技术前所未有 地高度发达的时代,人的生命和尊严,也应该得到有史以来最高的地位。今天,被希特勒杀害的三百万的人的名单已经放在庄严的大博物馆里和电脑网上的资料库 里,被斯大林杀害的一百三十四万个名字已经被刻写在电脑光盘上和大量分散各处的小型纪念碑上。我想,有尊严的北大人不会同意,北大受难者的名字是低人一等 不需纪念的,是可以被水洗般地遗忘的。

Categories: 未分类

Twitter works on technology to evade censors

2010年01月28日 Leave a comment
Categories: 未分类

keso’s view: 三网融合:不要成为倒退

2010年01月24日 Leave a comment





Categories: 未分类